Pagini recente » Cod sursa (job #1574629) | Cod sursa (job #76421) | Cod sursa (job #2800396) | Cod sursa (job #1633673) | Cod sursa (job #1017235)
#include <fstream>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,v[100001],stanga[100001],dreapta[100001],best[100001],i,c,a,b,q;
void update(int nod,int st,int dr){
if(st==dr){
v[nod]=stanga[nod]=dreapta[nod]=best[nod]=1;
return;}
int mij=(st+dr)/2;
update(2*nod,st,mij);
update(2*nod+1,mij+1,dr);
v[nod]=stanga[nod]=dreapta[nod]=best[nod]=v[2*nod]+v[2*nod+1];
}
void sosire(int nod,int st,int dr){
if(a<=st && dr<=b){
best[nod]=stanga[nod]=dreapta[nod]=0;
return;}
if(best[nod]==v[nod]){
best[2*nod]=stanga[2*nod]=dreapta[2*nod]=v[2*nod];
best[2*nod+1]=stanga[2*nod+1]=dreapta[2*nod+1]=v[2*nod+1];
}
int mij=(st+dr)/2;
if(a<=mij)
sosire(2*nod,st,mij);
if(b>mij)
sosire(2*nod+1,mij+1,dr);
best[nod]=max(dreapta[2*nod]+stanga[2*nod+1],max(best[2*nod],best[2*nod+1]));
if(stanga[2*nod]==v[2*nod])
stanga[nod]=stanga[2*nod]+stanga[2*nod+1];
else
stanga[nod]=stanga[2*nod];
if(dreapta[2*nod+1]==v[2*nod+1])
dreapta[nod]=dreapta[2*nod]+dreapta[2*nod+1];
else
dreapta[nod]=dreapta[2*nod+1];
}
void plecare(int nod,int st,int dr){
if(a<=st && dr<=b){
best[nod]=stanga[nod]=dreapta[nod]=v[nod];
return;}
int mij=(st+dr)/2;
if(best[nod]==0)
best[2*nod]=stanga[2*nod]=dreapta[2*nod]=best[2*nod+1]=stanga[2*nod+1]=dreapta[2*nod+1]=0;
if(a<=mij)
plecare(2*nod,st,mij);
if(b>mij)
plecare(2*nod+1,mij+1,dr);
best[nod]=max(dreapta[2*nod]+stanga[2*nod+1],max(best[2*nod],best[2*nod+1]));
if(stanga[2*nod]==v[2*nod])
stanga[nod]=stanga[2*nod]+stanga[2*nod+1];
else
stanga[nod]=stanga[2*nod];
if(dreapta[2*nod+1]==v[2*nod+1])
dreapta[nod]=dreapta[2*nod]+dreapta[2*nod+1];
else
dreapta[nod]=dreapta[2*nod+1];
}
int main()
{
f>>n>>q;
update(1,1,n);
for(i=1;i<=q;i++){
f>>c;
if(c==1){
f>>a>>b;
b=b+a-1;
sosire(1,1,n);
}
else
if(c==2){
f>>a>>b;
b=b+a-1;
plecare(1,1,n);
}
else
g<<best[1]<<"\n";
}
return 0;
}