#include<stdio.h>
#include<string.h>
#define maxn 50002
int sum[4*maxn],lsum[maxn*4],rsum[maxn*4];
int col[maxn*4];
void buildtree(int l,int r,int rt)
{
col[rt]=-1;
lsum[rt]=rsum[rt]=sum[rt]=r-l+1;
if(l==r) return ;
int mid=(l+r)>>1;
buildtree(l,mid,rt<<1);
buildtree(mid+1,r,rt<<1|1);
}
void pushdown(int rt,int k)//标记
{
if(col[rt]!=-1)
{
col[rt<<1]=col[rt<<1|1]=col[rt];
lsum[rt<<1]=rsum[rt<<1]=sum[rt<<1]=col[rt]?0:(k-(k>>1));
lsum[rt<<1|1]=rsum[rt<<1|1]=sum[rt<<1|1]=col[rt]?0:(k>>1);
col[rt]=-1;
}
}
int query(int w,int l,int r,int rt)
{
if(l==r) return 1;
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
if(sum[rt<<1]>=w) return query(w,l,mid,rt<<1);
else if(rsum[rt<<1]+lsum[rt<<1|1]>=w) return mid-rsum[rt<<1]+1;
else return query(w,mid+1,r,rt<<1|1);
}
int MAX(int a,int b)
{
return a>b?a:b;
}
void pushup(int rt,int k)
{
lsum[rt]=lsum[rt<<1]; //左区间左部分。
rsum[rt]=rsum[rt<<1|1]; //右区间右部分。
if(lsum[rt]==k-(k>>1))
lsum[rt]+=lsum[rt<<1|1];
if(rsum[rt]==k>>1)
rsum[rt]+=rsum[rt<<1];
sum[rt]=MAX(rsum[rt<<1]+lsum[rt<<1|1],MAX(sum[rt<<1],sum[rt<<1|1]));
}
void updata(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
lsum[rt]=rsum[rt]=sum[rt]=c?0:r-l+1;
col[rt]=c;
return ;
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
if(L<=mid) updata(L,R,c,l,mid,rt<<1);
if(R>mid) updata(L,R,c,mid+1,r,rt<<1|1);
pushup(rt,r-l+1);
}
int main()
{
freopen("Input.txt","r",stdin);
int n,m,k,b,h;
while(scanf("%d%d",&n,&m)!=EOF)
{
buildtree(1,n,1);
for(int i=1;i<=m;i++)
{
scanf("%d",&k);
if(k==1)
{
scanf("%d",&b);
if(sum[1]<b){ printf("0\n");continue;}
int y=query(b,1,n,1);
printf("%d\n",y);
updata(y,y+b-1,1,1,n,1);
}
else if(k==2)
{
scanf("%d%d",&b,&h);
updata(b,b+h-1,0,1,n,1);
}
}
}
return 0;
}
线段树Hotel
最新推荐文章于 2019-08-22 21:39:12 发布