这个题又是把懒惰标记和动作状态混在一起了==还有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; }