Pagini recente » Cod sursa (job #344839) | Cod sursa (job #2848705) | Cod sursa (job #2543526) | Cod sursa (job #66770) | Cod sursa (job #2098628)
# include <fstream>
# define DIM 400010
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct arbore{
int st,dr,Max,val;
} arb[DIM];
int trans[DIM],n,m,st,dr,val,tp,i;
void build(int nod,int st,int dr){
if(st==dr){
arb[nod].st=arb[nod].dr=arb[nod].Max=1;
return;
}
int mij=(st+dr)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
arb[nod].st=arb[nod].dr=arb[nod].Max=dr-st+1;
}
void update(int nod,int st,int dr,int p,int u){
if(trans[nod]!=arb[nod].val){
if(arb[nod].Max==0){
arb[nod].st=arb[nod].dr=arb[nod].Max=dr-st+1;
arb[nod].val=0;
trans[nod]=0;
trans[2*nod]=0;
trans[2*nod+1]=0;
}
else{
arb[nod].st=arb[nod].dr=arb[nod].Max=0;
arb[nod].val=1;
trans[nod]=1;
trans[2*nod]=1;
trans[2*nod+1]=1;
}
}
if(p<=st&&u>=dr){
if(arb[nod].Max==0){
arb[nod].st=arb[nod].dr=arb[nod].Max=dr-st+1;
arb[nod].val=0;
trans[nod]=0;
trans[2*nod]=0;
trans[2*nod+1]=0;
}
else{
arb[nod].st=arb[nod].dr=arb[nod].Max=0;
arb[nod].val=1;
trans[nod]=1;
trans[2*nod]=1;
trans[2*nod+1]=1;
}
return;
}
int mij=(st+dr)/2;
if(p<=mij)
update(2*nod,st,mij,p,u);
if(u>mij)
update(2*nod+1,mij+1,dr,p,u);
arb[nod].Max=max(arb[2*nod].Max,arb[2*nod+1].Max);
arb[nod].Max=max(arb[nod].Max,arb[2*nod].dr+arb[2*nod+1].st);
arb[nod].st=arb[2*nod].st;
if(arb[nod].st==mij-st+1)
arb[nod].st+=arb[2*nod+1].st;
arb[nod].dr=arb[2*nod+1].dr;
if(arb[nod].dr==dr-mij)
arb[nod].dr+=arb[2*nod].dr;
}
int main () {
fin>>n>>m;
build(1,1,n);
for(i=1;i<=m;i++){
fin>>tp;
if(tp<=2){
fin>>st>>val;
dr=st+val-1;
update(1,1,n,st,dr);
continue;
}
fout<<arb[1].Max<<"\n";
}
return 0;
}