题意:给n个连续的房间,然后1是询问有没有连续的b房间,没有输出0,有输出满足的最小的房间号,2是b到b+c-1的房间空出来了
思路:就是线段树区间合并维护最大连续空房间即可,加两个辅助数组L和R分别代表从左开始的最大连续和从右开始的最大连续,pushup时处理就行了
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int maxn=50010;
int L[maxn<<2],R[maxn<<2],cnt[maxn<<2],flag[maxn<<2];
inline int getint(){
int res=0;
char c=getchar();
bool mi=false;
while(c<'0' || c>'9') mi=(c=='-'),c=getchar();
while('0'<=c && c<='9') res=res*10+c-'0',c=getchar();
return mi ? -res : res;
}
void pushup(int node,int m){
L[node]=L[node<<1];
R[node]=R[node<<1|1];
if(L[node]==m-(m>>1)) L[node]+=L[node<<1|1];
if(R[node]==m>>1) R[node]+=R[node<<1];
cnt[node]=max(R[node<<1]+L[node<<1|1],max(cnt[node<<1],cnt[node<<1|1]));
}
void pushdown(int node,int m){
if(flag[node]!=-1){
flag[node<<1]=flag[node<<1|1]=flag[node];
if(flag[node]==1){
L[node<<1]=R[node<<1]=cnt[node<<1]=m-(m>>1);
L[node<<1|1]=R[node<<1|1]=cnt[node<<1|1]=m>>1;
}else{
L[node<<1]=R[node<<1]=cnt[node<<1]=0;
L[node<<1|1]=R[node<<1|1]=cnt[node<<1|1]=0;
}
flag[node]=-1;
}
}
void buildtree(int le,int ri,int node){
flag[node]=-1;
if(le==ri){
cnt[node]=L[node]=R[node]=1;
return ;
}
int t=(le+ri)>>1;
buildtree(le,t,node<<1);
buildtree(t+1,ri,node<<1|1);
pushup(node,ri-le+1);
}
void update(int l,int r,int val,int le,int ri,int node){
if(l<=le&&ri<=r){
if(val==0) L[node]=R[node]=cnt[node]=0;
else L[node]=R[node]=cnt[node]=ri-le+1;
flag[node]=val;
return ;
}
pushdown(node,ri-le+1);
int t=(le+ri)>>1;
if(l<=t) update(l,r,val,le,t,node<<1);
if(r>t) update(l,r,val,t+1,ri,node<<1|1);
pushup(node,ri-le+1);
}
int query(int x,int le,int ri,int node){
if(le==ri) return 1;
pushdown(node,ri-le+1);
int t=(le+ri)>>1;
if(cnt[node<<1]>=x) return query(x,le,t,node<<1);
else if(L[node<<1|1]+R[node<<1]>=x) return t+1-R[node<<1];
else return query(x,t+1,ri,node<<1|1);
}
int main(){
int n,m,a,b,c;
while(scanf("%d%d",&n,&m)!=-1){
buildtree(1,n,1);
for(int i=0;i<m;i++){
a=getint();b=getint();
if(a==1){
if(cnt[1]<b) printf("0\n");
else{
int ans=query(b,1,n,1);
printf("%d\n",ans);
update(ans,ans+b-1,0,1,n,1);
}
}else{
c=getint();
update(b,b+c-1,1,1,n,1);
}
}
}
return 0;
}