#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #include<cmath> #include<algorithm> #define FILE "read" #define MAXN 50010 using namespace std; struct node{int lx,rx,maxx,tag;}tr[MAXN<<3]; char buf[1<<15],*fs,*ft; inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin)),fs==ft)?0:*fs++;} inline int read(){ int x=0,f=1; char ch=getc(); while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getc();} while(isdigit(ch)) {x=x*10+ch-'0'; ch=getc();} return x*f; } void relord(int p,int l,int r){ if(tr[p].tag==0) tr[p].lx=tr[p].rx=tr[p].maxx=r-l+1; else if(tr[p].tag==1) tr[p].lx=tr[p].rx=tr[p].maxx=0; } void pushdown(int p,int l,int r){ if(tr[p].tag==-1) return; int mid=(l+r)>>1; tr[p<<1].tag=tr[p<<1|1].tag=tr[p].tag; relord(p<<1,l,mid); relord(p<<1|1,mid+1,r); tr[p].tag=-1; } void pushup(int p,int l,int r){ tr[p].maxx=max(tr[p<<1].maxx,max(tr[p<<1|1].maxx,tr[p<<1].rx+tr[p<<1|1].lx)); int mid=(l+r)>>1; if(tr[p<<1].lx==mid-l+1) tr[p].lx=tr[p<<1].lx+tr[p<<1|1].lx; else tr[p].lx=tr[p<<1].lx; if(tr[p<<1|1].rx==r-mid) tr[p].rx=tr[p<<1|1].rx+tr[p<<1].rx; else tr[p].rx=tr[p<<1|1].rx; } int ask(int p,int l,int r,int x){ pushdown(p,l,r); if(l==r) return l; int mid=(l+r)>>1; if(tr[p<<1].maxx>=x) return ask(p<<1,l,mid,x); if(tr[p<<1].rx+tr[p<<1|1].lx>=x) return mid-tr[p<<1].rx+1; return ask(p<<1|1,mid+1,r,x); } void updata(int p,int l,int r,int x,int y,int v){ pushdown(p,l,r); if(x<=l&&y>=r) {tr[p].tag=v; relord(p,l,r); return;} int mid=(l+r)>>1; if(mid>=y) updata(p<<1,l,mid,x,y,v); else if(mid<x) updata(p<<1|1,mid+1,r,x,y,v); else{ updata(p<<1,l,mid,x,mid,v); updata(p<<1|1,mid+1,r,mid+1,y,v); } pushup(p,l,r); } void build(int p,int l,int r){ pushdown(p,l,r); if(l==r) return; int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); } int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); int n=read(),m=read(); relord(1,1,n); build(1,1,n); for(int i=1;i<=m;++i){ int opt=read(),x=read(); if(opt==1){ if(tr[1].maxx>=x){ int t=ask(1,1,n,x); updata(1,1,n,t,t+x-1,1); printf("%d\n",t); } else puts("0"); } else{int y=read();updata(1,1,n,x,x+y-1,0);} } return 0; }
|