1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cctype> 5 using namespace std; 6 #define lson l,m,rt<<1 7 #define rson m+1,r,rt<<1|1 8 9 const int maxn=55555; 10 11 //c初始化为-1是因为传值的时候可能有两种情况,一种是清空的情况,另一种是 12 //住宿的情况,清空时借用0把下标传到子区间,而住宿的时候把1传到子区间 13 int lsum[maxn<<2],rsum[maxn<<2],msum[maxn<<2]; 14 int cover[maxn<<2]; 15 //做区间永远>=右区间 16 void Pushdown(int rt,int m){ 17 if(cover[rt]!=-1){ 18 cover[rt<<1]=cover[rt<<1|1]=cover[rt]; 19 msum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=cover[rt]?0:m-(m>>1); 20 //这不就是直接等于m吗?不是,因为如果是0的话,就是0. 21 msum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=cover[rt]?0:(m>>1); 22 cover[rt]=-1; 23 } 24 } 25 void Pushup(int rt,int m){ 26 lsum[rt]=lsum[rt<<1]; 27 rsum[rt]=rsum[rt<<1|1]; 28 if(lsum[rt]==m-(m>>1)) lsum[rt]+=lsum[rt<<1|1]; 29 if(rsum[rt]==(m>>1)) rsum[rt]+=rsum[rt<<1]; 30 msum[rt]=max(lsum[rt<<1|1]+rsum[rt<<1],max(msum[rt<<1],msum[rt<<1|1])); 31 } 32 33 void build(int l,int r,int rt){ 34 msum[rt]=lsum[rt]=rsum[rt]=r-l+1; 35 cover[rt]=-1; 36 if(l==r) return; 37 int m=(l+r)>>1; 38 build(lson); 39 build(rson); 40 } 41 42 int query(int w,int l,int r,int rt){ 43 //之所以会直接返回1,是因为在输入进来的时候判了可以取吗? 44 //如果取不到直接都进不来 45 if(l==r) return 1; 46 Pushdown(rt,r-l+1); 47 int m=(l+r)>>1; 48 if(msum[rt<<1]>=w) return query(w,lson); 49 else if(rsum[rt<<1]+lsum[rt<<1|1]>=w) return m-rsum[rt<<1]+1; 50 return query(w,rson); 51 } 52 53 void update(int L,int R,int c,int l,int r,int rt){ 54 if(L<=l&&r<=R){ 55 //如果全部都涵盖了,那么一定都更新 56 msum[rt]=lsum[rt]=rsum[rt]=c?0:r-l+1; 57 cover[rt]=c; 58 return; 59 } 60 Pushdown(rt,r-l+1); 61 int m=(l+r)>>1; 62 if(L<=m) update(L,R,c,lson); 63 if(m<R) update(L,R,c,rson); 64 Pushup(rt,r-l+1); 65 } 66 int main(){ 67 int n,m; 68 scanf("%d%d",&n,&m); 69 build(1,n,1); 70 int op,a,b; 71 while(m--){ 72 scanf("%d",&op); 73 if(op==1){ 74 scanf("%d",&a); 75 if(msum[1]<a) printf("0\n"); 76 else{ 77 int p=query(a,1,n,1); 78 printf("%d\n",p ); 79 update(p,p+a-1,1,1,n,1); 80 } 81 }else{ 82 scanf("%d%d",&a,&b); 83 update(a,a+b-1,0,1,n,1); 84 } 85 } 86 return 0; 87 }