Pagini recente » Cod sursa (job #505249) | Cod sursa (job #2309500)
#include <bits/stdc++.h>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
int l[200002],r[200002],a[200002],l1,r1;
void scoate(int l2,int r2,int nr)
{
if((l1<=l2&&r2<=r1)||l2==r2)
{
l[nr]=r[nr]=a[nr]=0;
if(l2!=r2)
{
int m=(l2+r2)/2;
scoate(l2,m,nr*2);
scoate(m+1,r2,nr*2+1);
}
return;
}
int m=(l2+r2)/2;
if(l1<=m)
scoate(l2,m,nr*2);
if(r1>m)
scoate(m+1,r2,nr*2+1);
if(l1<=l2)
l[nr]=0;
else
l[nr]=min(l1-l2,l[nr]);
if(r1>=r2)
r[nr]=0;
else
r[nr]=min(r2-r1,r[nr]);
a[nr]=max(max(a[nr*2],a[nr*2+1]),r[nr*2]+l[nr*2+1]);
}
void baga(int l2,int r2,int nr)
{
if((l1<=l2&&r2<=r1)||l2==r2)
{
l[nr]=r[nr]=a[nr]=r2-l2+1;
if(l2!=r2)
{
int m=(l2+r2)/2;
baga(l2,m,nr*2);
baga(m+1,r2,nr*2+1);
}
return;
}
int m=(l2+r2)/2;
if(l1<=m)
baga(l2,m,nr*2);
if(r1>m)
baga(m+1,r2,nr*2+1);
if(l[nr*2]==m-l2+1)
l[nr]=l[nr*2]+l[nr*2+1];
else
l[nr]=l[nr*2];
if(r[nr*2+1]==r2-m)
r[nr]=r[nr*2]+r[nr*2+1];
else
r[nr]=r[nr*2+1];
a[nr]=max(max(a[nr*2],a[nr*2+1]),r[nr*2]+l[nr*2+1]);
}
int main()
{
int n,q,nr;
in>>n>>q;
l1=1;r1=n;baga(1,n,1);
while(q--)
{
in>>nr;
if(nr==3)
out<<a[1]<<"\n";
else if(nr==2)
{
in>>l1>>r1;
r1+=l1-1;
baga(1,n,1);
}
else
{
in>>l1>>r1;
r1+=l1-1;
scoate(1,n,1);
}
}
return 0;
}