Pagini recente » Cod sursa (job #1864164) | Cod sursa (job #467985) | Cod sursa (job #2418067) | Cod sursa (job #1163377) | Cod sursa (job #571586)
Cod sursa(job #571586)
#include<cstdio>
#include<algorithm>
#define Nmax 300000
using namespace std;
int N,P,A,B,val;
struct arbore{
int st;
int dr;
int m;
} a[Nmax];
void init(int nod,int st,int dr){
if(st==dr){
a[nod].st=a[nod].dr=a[nod].m=1;
return;
}
int mij=(st+dr)/2;
init(2*nod,st,mij);
init(2*nod+1,mij+1,dr);
a[nod].st=a[nod].dr=a[nod].m=a[2*nod].m+a[2*nod+1].m;
}
void update(int nod,int st,int dr){
if(A <=st && dr<=B){
if(val==0)
a[nod].st=a[nod].dr=a[nod].m=val;
else a[nod].st=a[nod].dr=a[nod].m=dr-st+1;
return;
}
int mij=(st+dr)/2;
if(a[nod].m == 0 ){ //daca am sters anterior intervalul [st,dr]
a[2*nod].m=a[2*nod].st=a[2*nod].dr=0; //stergem copiii acestuia
a[2*nod+1].m=a[2*nod+1].st=a[2*nod+1].dr=0;
}
if(A<=mij) update(nod*2,st,mij);
if(B>mij) update(nod*2+1,mij+1,dr);
a[nod].st=a[2*nod].st;
a[nod].dr=a[2*nod+1].dr;
if(a[nod].st == mij-st+1 ) //daca tot intervalul din stanga este plin
a[nod].st += a[2*nod+1].st;
if(a[nod].dr == dr-mij) //daca tot intervalul din dreapta este plin
a[nod].dr += a[2*nod].dr;
a[nod].m=max(a[nod].st,a[nod].dr);
a[nod].m = max( max(a[nod].m,a[2*nod].dr+a[2*nod+1].st), max(a[2*nod].m,a[2*nod+1].m) );
}
int main(){
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&N,&P);
init(1,1,N);
for(;P;--P){
int tip;
scanf("%d",&tip);
switch(tip){
case 3:
printf("%d\n",a[1].m);
break;
default:
val=tip-1;
scanf("%d%d",&A,&B);
B+=A-1;
update(1,1,N);
break;}
}
return 0;
}