方法就是记录区间最大值,如果一个区间最大值不是0,说明有房间被占了,就跳到最大值+1的点
#include<bits/stdc++.h>
using namespace std;
const int MX=2*100000+1000;
#define LL long long
#define inf 0x3f3f3f3f
#define lson now<<1
#define rson now<<1|1
#define modn 998244353
inline int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-48;ch=getchar();}
return x*f;
}
int n,m;
struct tTree
{
int maxn;
int lazytag;
}tree[MX];
inline void pushup(int now)
{
tree[now].maxn=max(tree[lson].maxn,tree[rson].maxn);
}
inline void pushdown(int now,int l,int r)
{
int mid=(l+r)>>1;
if(tree[now].lazytag==1)
{
tree[lson].maxn=mid,tree[rson].maxn=r;
tree[lson].lazytag=tree[rson].lazytag=1;
tree[now].lazytag=0;
}
else if(tree[now].lazytag==-1)
{
tree[lson].maxn=tree[rson].maxn=0;
tree[lson].lazytag=tree[rson].lazytag=-1;
tree[now].lazytag=0;
}
}
inline void build(int now,int l,int r)
{
if(l==r)
{
tree[now].maxn=tree[now].lazytag=0;
return ;
}
int mid=(l+r)>>1;
build(lson,l,mid),build(rson,mid+1,r);
pushup(now);
}
inline void change(int now,int l,int r,int nl,int nr,int k)
{
if(nl<=l&&nr>=r)
{
if(k==1)
{
tree[now].lazytag=1;
tree[now].maxn=r;
}
else if(k==-1)
{
tree[now].lazytag=-1;
tree[now].maxn=0;
}
return ;
}
pushdown(now,l,r);
int mid=(l+r)>>1;
if(nl<=mid) change(lson,l,mid,nl,nr,k);
if(nr>=mid+1) change(rson,mid+1,r,nl,nr,k);
pushup(now);
}
inline int get_max(int now,int l,int r,int nl,int nr)
{
if(nl<=l&&nr>=r)
{
return tree[now].maxn;
}
pushdown(now,l,r);
int mid=(l+r)>>1;
int maxn=-inf;
if(nl<=mid) maxn=max(maxn,get_max(lson,l,mid,nl,nr));
if(nr>=mid+1) maxn=max(maxn,get_max(rson,mid+1,r,nl,nr));
return maxn;
}
int main(int argc, char const *argv[])
{
freopen("P2894_2.in","r",stdin);
freopen("P2894_2.out","w",stdout);
n=read(),m=read();
build(1,1,n);
// change(1,1,n,1,n,1);
// for(int i=1;i<=n;i++)
// {
// printf("%d\n",get_max(1,1,n,i,i));
// }
// change(1,1,n,1,n,-1);
// printf("%d\n",get_max(1,1,n,1,n));
while(m--)
{
int op;
op=read();
if(op==1)
{
int x;
x=read();
x--;
int l=1;
bool flag=0;
while(l+x<=n)
{
int now=get_max(1,1,n,l,l+x);
//printf("now: %d\n",now);
if(now==0)
{
flag=1;
printf("%d\n",l);
change(1,1,n,l,l+x,1);
break;
}
else l=now+1;
}
if(!flag) printf("0\n");
}
else if(op==2)
{
int l,r;
l=read(),r=read();
change(1,1,n,l,l+r-1,-1);
//printf("max: %d\n",get_max(1,1,n,6,6));
}
}
return 0;
}
/*
10 6
1 3
1 3
1 3
1 3
2 5 5
1 6
*/