Pagini recente » Diferente pentru utilizator/mihneaghira intre reviziile 29 si 28 | Diferente pentru utilizator/denisa0230 intre reviziile 17 si 40 | Monitorul de evaluare | Istoria paginii utilizator/macajou | Cod sursa (job #2510109)
#include <iostream>
#include <fstream>
using namespace std;
ifstream x("hotel.in");
ofstream y("hotel.out");
int a,b,n,m,val,i;
struct elem
{
int st,dr,sol,t;
}v[4*100002+200];
void update(int nod, int left, int right)
{
if(left>=a && right<=b)
{
if(val==1)
v[nod].st=v[nod].dr=v[nod].sol=0;
else
v[nod].st=v[nod].dr=v[nod].sol=right-left+1;
v[nod].t=1;
return;
}
int mij=(left+right)/2;
if(v[nod].t==1)
{
if(v[nod].sol==0)
{
v[2*nod].sol=v[2*nod].st=v[2*nod].dr=0;
v[2*nod+1].sol=v[2*nod+1].st=v[2*nod+1].dr=0;
}
else
{
v[2*nod].sol=v[2*nod].st=v[2*nod].dr=mij-left+1;
v[2*nod+1].sol=v[2*nod+1].st=v[2*nod+1].dr=right-mij;
}
v[2*nod].t=v[2*nod+1].t=1;
v[nod].t=0;
}
if(a<=mij)
update(2*nod,left,mij);
if(b>mij)
update(nod*2+1,mij+1,right);
v[nod].sol=max(max(v[2*nod].sol,v[2*nod+1].sol),v[2*nod].dr+v[2*nod+1].st);
v[nod].st=v[2*nod].st;
if(v[2*nod].st==mij-left+1)
v[nod].st+=v[2*nod+1].st;
v[nod].dr=v[2*nod+1].dr;
if(v[2*nod+1].dr==right-mij)
v[nod].dr+=v[2*nod].dr;
}
int main()
{
x>>n>>m;
a=1;
b=n;
val=2;
update(1,1,n);
for(i=1;i<=m;i++)
{
x>>val;
if(val==1)
{
x>>a>>b;
b=a+b-1;
update(1,1,n);
}
else
{
if(val==2)
{
x>>a>>b;
b=a+b-1;
update(1,1,n);
}
else
y<<v[1].sol<<'\n';
}
}
x.close();
y.close();
return 0;
}