【题意】 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边
2 a b:将[a,a+b-1]的房间清空
【思路】记录区间中最长的空房间
【线段树操作】 update:区间替换 query:询问满足条件的最左断点
//Created Author :just_sort
//Created Time :2016/3/2 18:49
//Created File :Hotel.
/**************************/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 50010
int getInt(int &x)
{
return scanf("%d",&x);
}
void read(int &tmp)
{
tmp=0;
char ch=getchar();
int fu=1;
for(;ch<'0'||ch>'9';ch=getchar())
if(ch=='-')fu=-1;
for(;ch>='0'&&ch<='9';ch=getchar())
tmp=tmp*10+ch-'0';
tmp*=fu;
}
int lsum[maxn<<2],rsum[maxn<<2],msum[maxn<<2];//
int cover[maxn<<2];//打标记
void Push_Down(int rt,int m){
if(cover[rt]!=-1){
cover[rt<<1]=cover[rt<<1|1]=cover[rt];
msum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=cover[rt]?0:m-(m>>1);
msum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=cover[rt]?0:(m>>1);
cover[rt]=-1;
}
}
void Push_Up(int rt,int m){
lsum[rt]=lsum[rt<<1];
rsum[rt]=rsum[rt<<1|1];
if(lsum[rt]==m-(m>>1)) lsum[rt]+=lsum[rt<<1|1];
if(rsum[rt]==(m>>1)) rsum[rt]+=rsum[rt<<1];
msum[rt]=max(max(msum[rt<<1],msum[rt<<1|1]),lsum[rt<<1|1]+rsum[rt<<1]);
}
void Build(int l,int r,int rt)
{
cover[rt]=-1;
lsum[rt]=rsum[rt]=msum[rt]=r-l+1;
if(l==r) return ;
int m=(l+r)>>1;
Build(lson);
Build(rson);
}
void Update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
msum[rt]=lsum[rt]=rsum[rt]=c?0:r-l+1;
cover[rt]=c;
return ;
}
Push_Down(rt,r-l+1);
int m=(l+r)>>1;
if(L<=m) Update(L,R,c,lson);
if(m<R) Update(L,R,c,rson);
Push_Up(rt,r-l+1);
}
int query_ans(int len,int l,int r,int rt)//查询是长度为len的空房间的位置
{
if(l==r)return l;
Push_Down(rt,r-l+1);
int m=(l+r)>>1;
if(msum[rt<<1]>=len) return query_ans(len,lson);
else if(rsum[rt<<1]+lsum[rt<<1|1]>=len) return m-rsum[rt<<1]+1;
else return query_ans(len,rson);
}
int main()
{
int n,m,a,b,type;
read(n);read(m);
Build(1,n,1);
while(m--)
{
read(type);
if(type==1)
{
read(a);
if(a>msum[1])puts("0");
else
{
int ans=query_ans(a,1,n,1);
printf("%d\n",ans);
Update(ans,ans+a-1,1,1,n,1);
}
}
else
{
read(a);
read(b);
Update(a,a+b-1,0,1,n,1);
}
}
return 0;
}