#include <bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int MAXN=50005;
struct SegmentTree
{
int emp,lemp,remp;
int tag;
} tre[MAXN*4];
int N,M;
void PushUp(int rt,int l,int r)
{
int len=r-l+1,llen=((l+r)>>1)-l+1,rlen=r-((l+r)>>1);
tre[rt].emp=max(tre[lson].remp+tre[rson].lemp,max(tre[lson].emp,tre[rson].emp));
tre[rt].lemp=(tre[lson].emp==llen)?llen+tre[rson].lemp:tre[lson].lemp;
tre[rt].remp=(tre[rson].emp==rlen)?rlen+tre[lson].remp:tre[rson].remp;
return;
}
void Build(int rt,int l,int r)
{
if(l==r)
{
// printf("Find a Leaf!%d %d %d\n",rt,l,r);
tre[rt].emp=tre[rt].lemp=tre[rt].remp=1;
return;
}
int mid=(l+r)>>1;
Build(lson,l,mid);
Build(rson,mid+1,r);
PushUp(rt,l,r);
return;
}
void PushDown(int rt,int l,int r)
{
if(tre[rt].tag==1)//stay
{
tre[lson].emp=tre[rson].emp=tre[rt].emp=0;
tre[lson].lemp=tre[rson].lemp=tre[rt].lemp=0;
tre[lson].remp=tre[rson].remp=tre[rt].remp=0;
tre[lson].tag=tre[rson].tag=1;
}
if(tre[rt].tag==2)//clear
{
int len=r-l+1,llen=((l+r)>>1)-l+1,rlen=r-((l+r)>>1);
tre[lson].emp=tre[lson].lemp=tre[lson].remp=llen;
tre[rson].emp=tre[rson].lemp=tre[rson].remp=rlen;
tre[rt].emp=tre[rt].lemp=tre[rt].remp=len;
tre[lson].tag=tre[rson].tag=2;
}
tre[rt].tag=0;
return;
}
int Query(int rt,int l,int r,int x)
{
PushDown(rt,l,r);
if(l==r) return l;
int mid=(l+r)>>1;
// if(x==4) printf("%d %d %d %d %d %d %d %d\n",rt,x,l,r,tre[lson].emp,tre[rson].emp,tre[lson].remp,tre[rson].lemp);
if(tre[lson].emp>=x) return Query(lson,l,mid,x);
if(tre[lson].remp+tre[rson].lemp>=x) return mid-tre[lson].remp+1;
if(tre[rson].emp>=x) return Query(rson,mid+1,r,x);
return 0;
}
void Update(int rt,int l,int r,int ql,int qr,int x)
{
PushDown(rt,l,r);
if(ql<=l&&r<=qr)
{
tre[rt].tag=x;
tre[rt].emp=tre[rt].lemp=tre[rt].remp=((x==1)?0:r-l+1);
return;
}
int mid=(l+r)>>1;
if(ql<=mid) Update(lson,l,mid,ql,qr,x);
if(mid<qr) Update(rson,mid+1,r,ql,qr,x);
PushUp(rt,l,r);
return;
}
int main()
{
scanf("%d %d",&N,&M);
Build(1,1,N);
while(M--)
{
int opt,x,y;
scanf("%d",&opt);
if(opt==1)
{
// int x;
scanf("%d",&x);
int l=Query(1,1,N,x);
Update(1,1,N,l,l+x-1,1);
printf("%d\n",l);
}
else
{
scanf("%d %d",&x,&y);
Update(1,1,N,x,y+x-1,2);
}
}
return 0;
}
看讨论区 8 分的都是 pushdown 写错了,但我似乎没有检查出问题?qwq