Pagini recente » Cod sursa (job #1547716) | Cod sursa (job #1036529) | Cod sursa (job #1232941) | Cod sursa (job #7829) | Cod sursa (job #771502)
Cod sursa(job #771502)
#include<iostream>
#include<fstream>
using namespace std;
int s[400001],l[400001],r[400001],d[400001],a,b,val;
int maxim(int a, int b)
{
if(a>=b)
return a;
return b;
}
void built(int nod, int st, int dr)
{
int mij;
s[nod]=dr-st+1;
l[nod]=s[nod];
r[nod]=s[nod];
d[nod]=-1;
if(st==dr)
return ;
mij=(st+dr)/2;
built(nod*2,st,mij);
built(nod*2+1,mij+1,dr);
}
void update(int nod, int st, int dr)
{
int mij;
if((a<=st)&&(dr<=b)) {
d[nod]=val;
s[nod]=(dr-st+1)*val;
l[nod]=s[nod];
r[nod]=s[nod];
return ;
}
mij=(st+dr)/2;
if(d[nod]!=-1) {
d[nod*2]=d[nod];
s[nod*2]=(mij-st+1)*d[nod];
l[nod*2]=s[nod*2];
r[nod*2]=s[nod*2];
d[nod*2+1]=d[nod];
s[nod*2+1]=(dr-mij)*d[nod];
l[nod*2+1]=s[nod*2+1];
r[nod*2+1]=s[nod*2+1];
d[nod]=-1;
}
if(a<=mij)
update(2*nod,st,mij);
if(mij<b)
update(2*nod+1,mij+1,dr);
s[nod]=maxim(r[2*nod]+l[2*nod+1],maxim(s[nod*2],s[nod*2+1]));
r[nod]=r[nod*2+1];
if(r[nod*2+1]==(dr-mij) && r[nod]<(r[nod*2+1]+r[nod*2]))
r[nod]=r[nod*2+1]+r[nod*2];
l[nod]=l[nod*2];
if(l[nod*2]==(mij-st+1) && l[nod]<(l[nod*2]+l[nod*2+1]))
l[nod]=l[nod*2]+l[nod*2+1];
}
int main ()
{
int n,i,opt,p;
ifstream f("hotel.in");
ofstream g("hotel.out");
f>>n>>p;
built(1,1,n);
for(i=1;i<=p;i++) {
f>>opt;
if(opt==1) {
f>>a>>b;
b=a+b-1;
val=0;
update(1,1,n);
}
else if(opt==2) {
f>>a>>b;
b=a+b-1;
val=1;
update(1,1,n);
}
else g<<s[1]<<'\n';
}
f.close();
g.close();
return 0;
}