这个题又是把懒惰标记和动作状态混在一起了==还有push-up push-down 背了吧。。。
好怕怕…… 注意1和L!
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct node
{
int l,r,lsum,rsum,sum,loop;
}tree[400000];
int Find_Max(int a,int b ,int c)
{
int maxn=a>b?a:b;
maxn=maxn>c?maxn:c;
return maxn;
}
void push_down(int t)
{
if(tree[t].loop!=-1)
{
tree[t<<1].loop=tree[t<<1|1].loop=tree[t].loop;
if(tree[t].loop)
{
tree[t<<1].lsum=tree[t<<1].rsum=tree[t<<1].sum=0;
tree[t<<1|1].lsum=tree[t<<1|1].rsum=tree[t<<1|1].sum=0;
}
else //if(tree[t].loop==0)
{
tree[t<<1].lsum=tree[t<<1].rsum=tree[t<<1].sum=tree[t<<1].r-tree[t<<1].l+1;
tree[t<<1|1].lsum=tree[t<<1|1].rsum=tree[t<<1|1].sum=tree[t<<1|1].r-tree[t<<1|1].l+1;
}
tree[t].loop=-1;
}
}
void push_up(int l,int r,int t)
{
tree[t].lsum=tree[t<<1].lsum;
tree[t].rsum=tree[t<<1|1].rsum;
int x=(l+r)/2;
if(tree[t].lsum==x-l+1) tree[t].lsum+=tree[t<<1|1].lsum;
if(tree[t].rsum==r-x) tree[t].rsum+=tree[t<<1].rsum;
tree[t].sum=Find_Max(tree[t<<1].sum,tree[t<<1|1].sum,tree[t<<1].rsum+tree[t<<1|1].lsum);///
}
void build(int l,int r,int t)
{
tree[t].l=l,tree[t].r=r;
tree[t].sum=tree[t].lsum=tree[t].rsum=r-l+1;
tree[t].loop=-1;
if(l==r) return;
int x=(l+r)/2;
build(l,x,2*t);
build(x+1,r,2*t+1);
}
void update_tree(int l,int r,int t,int cnt)
{
if(tree[t].l==l&&tree[t].r==r)
{
tree[t].loop=cnt;
if(cnt) tree[t].lsum=tree[t].rsum=tree[t].sum=0;
else tree[t].lsum=tree[t].rsum=tree[t].sum=r-l+1;
return;
}
push_down(t);
int x=(tree[t].l+tree[t].r)/2;
if(x>=r) update_tree(l,r,2*t,cnt);
else if(x+1<=l) update_tree(l,r,2*t+1,cnt);
else
{
update_tree(l,x,2*t,cnt);
update_tree(x+1,r,t<<1|1,cnt);
}
push_up(tree[t].l,tree[t].r,t);
}
int Query(int l,int r,int t,int cnt)
{
if(l==r) return 1;
int x=(l+r)/2;
push_down(t);
if(tree[t<<1].sum>=cnt) return Query(l,x,t<<1,cnt);
else if(tree[t<<1].rsum+tree[t<<1|1].lsum>=cnt)return x-tree[t<<1].rsum+1;
else return Query(x+1,r,t<<1|1,cnt);
}
int main()
{
// freopen("cin.txt","r",stdin);
int i,j,n,m,x,y;
while(~scanf("%d%d",&n,&m))
{
build(1,n,1);
while(m--)
{
scanf("%d",&i);
if(i==1)
{
scanf("%d",&x);
if(tree[1].sum<x)
{
printf("0\n");
continue;
}
y=Query(1,n,1,x);
printf("%d\n",y);
update_tree(y,y+x-1,1,1);
}
else
{
scanf("%d%d",&x,&y);
update_tree(x,x+y-1,1,0);
}
}
}
return 0;
}