这道题和那道HDOJ 3308 LCIS比较像。。那道题目我就写了超久,当时是不确定保存什么信息。。这道题也写了很久,主要是各种低级错误,找错找了很久,超级火。。。。
#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#define maxn 200005
#define eps 1e-6
#define mod 1000000007
#define INF 99999999
#define lowbit(x) (x&(-x))
typedef long long LL;
using namespace std;
int lnum[maxn], rnum[maxn], segnum[maxn];
int lmax[maxn], rmax[maxn];
int segmax[maxn], mark[maxn];
int n, m, k, ok, ans;
int ql, qr, cnt;
void build(int o, int L, int R)
{
lnum[o]=segnum[o]=L, rnum[o]=R;
lmax[o]=rmax[o]=segmax[o]=R-L+1;
mark[o]=0;
if(L==R) return;
int mid=(L+R)>>1;
build(o<<1, L, mid);
build(o<<1 | 1, mid+1, R);
}
void pushdown(int o, int L, int R)
{
int mid=(R+L)>>1;
lnum[o<<1]=segnum[o]=L, rnum[o<<1]=mid;
lnum[o<<1 | 1]=mid+1, rnum[o<<1 | 1]=R;
lmax[o<<1]=rmax[o<<1]=segmax[o<<1]=mid-L+1;
lmax[o<<1 | 1]=rmax[o<<1 | 1]=segmax[o<<1 | 1]=R-mid;
mark[o<<1]=mark[o<<1 | 1]=1;
mark[o]=0;
}
void _pushdown(int o, int L, int R)
{
int mid=(R+L)>>1;
lnum[o<<1]=segnum[o]=L, rnum[o<<1]=mid;
lnum[o<<1 | 1]=mid+1, rnum[o<<1 | 1]=R;
lmax[o<<1]=rmax[o<<1]=segmax[o<<1]=0;
lmax[o<<1 | 1]=rmax[o<<1 | 1]=segmax[o<<1 | 1]=0;
mark[o<<1]=mark[o<<1 | 1]=2;
mark[o]=0;
}
void pushup(int o, int L, int R)
{
int tmp=0;
if(rmax[o<<1] && lmax[o<<1 | 1]) tmp=rmax[o<<1]+lmax[o<<1 | 1];
lnum[o]=lnum[o<<1], rnum[o]=rnum[o<<1 | 1];
if(tmp>=segmax[o<<1] && tmp>=segmax[o<<1 | 1]) segmax[o]=tmp, segnum[o]=rnum[o<<1]-rmax[o<<1]+1;
else if(segmax[o<<1]>segmax[o<<1 | 1]) segmax[o]=segmax[o<<1], segnum[o]=segnum[o<<1];
else segmax[o]=segmax[o<<1 | 1], segnum[o]=segnum[o<<1 | 1];
if(lnum[o]==segnum[o]) lmax[o]=segmax[o];
else lmax[o]=lmax[o<<1];
if(rnum[o]==segmax[o]+segnum[o]-1) rmax[o]=segmax[o];
else rmax[o]=rmax[o<<1 | 1];
}
void updata(int o, int L, int R)
{
if(ql<=L && qr>=R){
if(k==1){
lnum[o]=segnum[o]=L, rnum[o]=R;
lmax[o]=rmax[o]=segmax[o]=R-L+1;
mark[o]=1;
}
else{
lnum[o]=segnum[o]=L, rnum[o]=R;
lmax[o]=rmax[o]=segmax[o]=0;
mark[o]=2;
}
return;
}
if(mark[o]==1) pushdown(o, L, R);
if(mark[o]==2) _pushdown(o, L, R);
int mid=(R+L)>>1;
if(ql<=mid) updata(o<<1, L, mid);
if(qr>mid) updata(o<<1 | 1, mid+1, R);
pushup(o, L, R);
}
void query(int o, int L, int R)
{
if(ok) return;
if(segmax[o]<cnt) return;
if(L==R){
ans=L, ok=1;
return;
}
int mid=(R+L)/2;
if(segmax[o<<1]>=cnt) query(o<<1, L, mid);
if(ok) return;
if(rmax[o<<1]+lmax[o<<1 | 1]>=cnt) ans=rnum[o<<1]-rmax[o<<1]+1, ok=1;
if(ok) return;
if(segmax[o<<1 | 1]>=cnt) query(o<<1 | 1, mid+1, R);
if(ok) return;
ans=segnum[o], ok=1;
}
void solve(void)
{
int kk;
while(m--){
scanf("%d",&kk);
if(kk==1){
k=2, ok=0;
scanf("%d",&cnt);
query(1, 1, n);
if(ok){
printf("%d\n", ans);
ql=ans, qr=ans+cnt-1;
updata(1, 1, n);
}
else printf("0\n");
/*
if(segmax[1]>=cnt){
printf("%d\n", segnum[1]);
ql=segnum[1], qr=segnum[1]+cnt-1;
updata(1, 1, n);
}
else printf("0\n");
*/
}
else{
scanf("%d%d",&ql,&qr);
qr+=ql-1;
k=1;
updata(1, 1, n);
}
}
}
int main(void)
{
while(scanf("%d%d",&n,&m)!=EOF){
build(1, 1, n);
solve();
}
return 0;
}