#include<iostream>
using namespace std;
struct tree{
int l,r,len,lsum,rsum,sum,lazy;
}a[200005];
void build(int k,int l,int r){
a[k].l=l,a[k].r=r;
a[k].len=a[k].lsum=a[k].rsum=a[k].sum=r-l+1;
if(l==r)return;
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
}
void pushdown(int k){
if(a[k].lazy==1){
a[k*2].sum=a[k*2].lsum=a[k*2].rsum=0;
a[k*2+1].sum=a[k*2+1].lsum=a[k*2+1].rsum=0;
a[k*2].lazy=a[k*2+1].lazy=1;
a[k].lazy=0;
}
if(a[k].lazy==2){
a[k*2].sum=a[k*2].lsum=a[k*2].rsum=a[k*2].len;
a[k*2+1].sum=a[k*2+1].lsum=a[k*2+1].rsum=a[k*2+1].len;
a[k*2].lazy=a[k*2+1].lazy=2;
a[k].lazy=0;
}
}
void change(int k,int l,int r,int flag){
if(l<=a[k].l&&r>=a[k].r){
if(flag==1)a[k].lsum=a[k].rsum=a[k].sum=0;
if(flag==2)a[k].lsum=a[k].rsum=a[k].sum=a[k].len;
a[k].lazy=flag;
return;
}
pushdown(k);
if(l<=a[k*2].r)change(k*2,l,r,flag);
if(r>=a[k*2+1].l)change(k*2+1,l,r,flag);
if(a[k*2].sum=a[k*2].len)a[k].lsum=a[k*2].sum+a[k*2+1].lsum;
else a[k].lsum=a[k*2].lsum;
if(a[k*2+1].sum=a[k*2+1].len)a[k].rsum=a[k*2+1].sum+a[k*2].rsum;
else a[k].rsum=a[k*2+1].rsum;
a[k].sum=max(max(a[k*2].sum,a[k*2+1].sum),a[k*2].rsum+a[k*2+1].lsum);
}
int query(int k,int sum){
pushdown(k);
if(a[k].l==a[k].r)return a[k].l;
if(a[k*2].sum>=sum)return query(k*2,sum);
if(a[k*2].rsum+a[k*2+1].lsum>=sum)return (a[k].l+a[k].r)/2-a[k*2].rsum+1;
if(a[k*2+1].sum>=sum)return query(k*2+1,sum);
}
int main(){
int n,m;
cin>>n>>m;
build(1,1,n);
for(int i=1;i<=m;i++){
int flag,x,y;
cin>>flag>>x;
if(flag==1){
if(a[1].sum<x){cout<<0<<endl;continue;}
int k=query(1,x);
cout<<k<<endl;
change(1,k,k+x-1,1);
}
if(flag==2){
cin>>y;
change(1,x,x+y-1,2);
}
}
return 0;
}
这个代码做了两三个小时了,调了半天,连样例都过不掉。请发现问题的Dalao们@我一下,感激不尽!!!