不错的一道区间合并的问题
为什么自己总喜欢写 (l-r+1)!!!!!!!!
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int MAXN=55555;
int lsum[MAXN<<2],rsum[MAXN<<2],msum[MAXN<<2],lazy[MAXN<<2];
void pushup(int l,int r,int rt)
{
int mid=(l+r)>>1;
lsum[rt]=lsum[rt<<1];
rsum[rt]=rsum[rt<<1|1];
if(lsum[rt]==(mid-l+1))
lsum[rt]+=lsum[rt<<1|1];
if(rsum[rt]==(r-mid))
rsum[rt]+=rsum[rt<<1];
msum[rt]=max(msum[rt<<1],msum[rt<<1|1]);
msum[rt]=max(msum[rt],rsum[rt<<1]+lsum[rt<<1|1]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
lsum[rt]=rsum[rt]=msum[rt]=(r-l+1);
return;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
pushup(l,r,rt);
}
void pushdown(int l,int r,int rt)
{
if(lazy[rt]!=-1)
{
int mid=(l+r)>>1;
lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
lsum[rt<<1]=rsum[rt<<1]=msum[rt<<1]=lazy[rt]?0:(mid-l+1);
lsum[rt<<1|1]=rsum[rt<<1|1]=msum[rt<<1|1]=lazy[rt]?0:(r-mid);
lazy[rt]=-1;
}
}
int query(int c,int l,int r,int rt)
{
if(l==r) return l;
int mid=(l+r)>>1;
pushdown(l,r,rt);
int ans;
if(msum[rt<<1]>=c) ans=query(c,lson);
else if(rsum[rt<<1]+lsum[rt<<1|1]>=c) ans=mid-rsum[rt<<1]+1;
else ans=query(c,rson);
return ans;
}
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);
lazy[rt]=c;
return ;
}
int mid=(l+r)>>1;
pushdown(l,r,rt);
if(L<=mid) update(L,R,c,lson);
if(R>mid) update(L,R,c,rson);
pushup(l,r,rt);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
memset(lazy,-1,sizeof(lazy));
build(1,n,1);
for(int i=0;i<m;i++)
{
int a;
scanf("%d",&a);
if(a==1)
{
int b;
scanf("%d",&b);
if(msum[1]<b)
{
printf("0\n");
continue;
}
int ans=query(b,1,n,1);
printf("%d\n",ans);
update(ans,ans+b-1,1,1,n,1);
}
else
{
int t1,t2;
scanf("%d%d",&t1,&t2);
update(t1,t1+t2-1,0,1,n,1);
}
}
return 0;
}