区间合并问题。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int maxn=55555;
int msum[maxn<<2], lsum[maxn<<2], rsum[maxn<<2], cov[maxn<<2];
void build(int l, int r, int rt)
{
cov[rt]=-1;
msum[rt]=lsum[rt]=rsum[rt]=r-l+1;
if(l==r)return ;
int mid=(l+r)>>1;
build(lson);
build(rson);
}
void pushup(int rt, int m)
{
lsum[rt]=lsum[rt<<1];
rsum[rt]=rsum[rt<<1|1];
if(lsum[rt<<1]==m-(m>>1))lsum[rt]+=lsum[rt<<1|1];
if(rsum[rt<<1|1]==m>>1)rsum[rt]+=rsum[rt<<1];
msum[rt]=max(rsum[rt<<1]+lsum[rt<<1|1], max(msum[rt<<1], msum[rt<<1|1]));
}
void pushdown(int rt, int m)
{
if(cov[rt]==-1)return ;
cov[rt<<1]=cov[rt<<1|1]=cov[rt];
msum[rt<<1]=lsum[rt<<1]=rsum[rt<<1] = cov[rt] ? 0 : m-(m>>1);
msum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1] = cov[rt] ? 0 : m>>1;
cov[rt]=-1;
}
void update(int L, int R, int v, int l, int r, int rt)
{
if(L<=l && R>=r)
{
msum[rt]=lsum[rt]=rsum[rt] = v ? 0 : r-l+1;
cov[rt]=v;
return ;
}
int mid=(l+r)>>1;
pushdown(rt, r-l+1);
if(L<=mid)update(L, R, v, lson);
if(R>mid)update(L, R, v, rson);
pushup(rt, r-l+1);
}
int query(int w, int l, int r, int rt)
{
if(l==r)return l;
int mid=(l+r)>>1;
pushdown(rt, r-l+1);
if(msum[rt<<1]>=w)return query(w, lson);
if(rsum[rt<<1]+lsum[rt<<1|1]>=w)return mid-rsum[rt<<1]+1;
return query(w, rson);
}
int main()
{
int n, m, op, a, b;
while(~scanf("%d%d", &n, &m))
{
build(1, n, 1);
while(m--)
{
scanf("%d", &op);
if(op==1)
{
int p;
scanf("%d", &a);
if(a>msum[1])
{
puts("0");
continue ;
}
printf("%d\n", p=query(a, 1, n, 1));
update(p, p+a-1, 1, 1, n, 1);
}
else
{
scanf("%d%d", &a, &b);
update(a, a+b-1, 0, 1, n, 1);
}
}
}
return 0;
}