Pagini recente » Cod sursa (job #2247091) | Cod sursa (job #1240302) | Cod sursa (job #1961338) | Cod sursa (job #3132238) | Cod sursa (job #1294387)
#include <fstream>
#define DIM 100011
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,m,P,nr;
struct arbore{
int v,st,dr;
} A[4*DIM-1];
void built(int nod,int p,int u){
if(p==u){
A[nod].v=A[nod].st=A[nod].dr=1;
return;
}
int mid=p+(u-p)/2;
built(2*nod,p,mid);
built(2*nod+1,mid+1,u);
A[nod].v=A[nod].st=A[nod].dr=A[2*nod+1].v+A[2*nod].v;
}
void update(int nod,int p,int u,int a,int b){
if(a<=p && u<=b){
if(nr==1)
A[nod].v=A[nod].st=A[nod].dr=0;
else
A[nod].v=A[nod].st=A[nod].dr=u-p+1;
return;
}
int mid=p+(u-p)/2;
if(A[nod].v==0){
A[2*nod].v=A[2*nod].st=A[2*nod].dr=0;
A[2*nod+1].v=A[2*nod+1].st=A[2*nod+1].dr=0;
}
else if(A[nod].v==u-p+1){
A[2*nod].v=A[2*nod].st=A[2*nod].dr=mid-p+1;
A[2*nod+1].v=A[2*nod+1].st=A[2*nod+1].dr=u-mid;
}
if(a<=mid)
update(2*nod,p,mid,a,b);
if(b>mid)
update(2*nod+1,mid+1,u,a,b);
A[nod].v=max(A[2*nod].v,A[2*nod+1].v);
A[nod].v=max(A[nod].v,A[2*nod].dr+A[2*nod+1].st);
A[nod].st=A[2*nod].st;
A[nod].dr=A[2*nod+1].dr;
if(A[2*nod].st==mid-p+1)
A[nod].st+=A[2*nod+1].st;
if(A[2*nod+1].dr==u-mid)
A[nod].dr+=A[2*nod].dr;
}
int main(void){
register int i,j,t,x;
f>>n>>P;
built(1,1,n);
for(;P;P--){
f>>t;
if(t==1){
f>>i>>m;
nr=1;
update(1,1,n,i,i+m-1);
}
else if(t==2){
f>>i>>m;
nr=-1;
update(1,1,n,i,i+m-1);
}
else{
g<<A[1].v<<"\n";
}
}
return 0;
}