Pagini recente » Cod sursa (job #1100498) | Cod sursa (job #1378335) | Cod sursa (job #1410599) | Cod sursa (job #1770734) | Cod sursa (job #2310834)
#include <bits/stdc++.h>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
int l[1000002],r[1000002],a[1000002],l1,r1;
void scoate(int l2,int r2,int nr)
{
if((l1<=l2&&r2<=r1)||l2==r2)
{
l[nr]=r[nr]=a[nr]=0;
return;
}
int m=(l2+r2)/2;
if(!a[nr])
l[nr*2]=r[nr*2]=a[nr*2]=l[nr*2+1]=r[nr*2+1]=a[nr*2+1]=0;
if(a[nr]==r2-l2+1)
l[nr*2]=r[nr*2]=a[nr*2]=m-l2+1,l[nr*2+1]=r[nr*2+1]=a[nr*2+1]=r2-m;
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;
return;
}
int m=(l2+r2)/2;
if(!a[nr])
l[nr*2]=r[nr*2]=a[nr*2]=l[nr*2+1]=r[nr*2+1]=a[nr*2+1]=0;
if(a[nr]==r2-l2+1)
l[nr*2]=r[nr*2]=a[nr*2]=m-l2+1,l[nr*2+1]=r[nr*2+1]=a[nr*2+1]=r2-m;
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;
a[1]=l[1]=r[1]=n;
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;
}