Pagini recente » Cod sursa (job #65299) | Cod sursa (job #49988) | Cod sursa (job #2199644) | Cod sursa (job #2953161) | Cod sursa (job #2344458)
#include <stdio.h>
#include <iostream>
using namespace std;
FILE *in,*out;
int n,m,p,lf,rg,val;
struct name
{
int gol,l,r,down;
} v[200002];
void read()
{
fscanf(in,"%d %d",&n,&p);
}
void update(int node, int left,int right)
{
if(left>=lf && right<=rg)
{
if(val==1)
v[node].l=v[node].r=v[node].gol=0;
else
v[node].l=v[node].r=v[node].gol=right-left+1;
v[node].down=1;
return;
}
int mij=(left+right)/2;
if(v[node].down==1)
{
if(v[node].gol==0)
{
v[2*node].gol=v[2*node].l=v[2*node].r=0;
v[2*node+1].gol=v[2*node+1].l=v[2*node+1].r=0;
}
else
{
v[2*node].gol=v[2*node].l=v[2*node].r=mij-left+1;
v[2*node+1].gol=v[2*node+1].l=v[2*node+1].r=right-mij;
}
v[2*node].down=v[2*node+1].down=1;
v[node].down=0;
}
if(lf<=mij)
update(2*node, left, mij);
if(rg>mij)
update(2*node+1, mij+1, right);
v[node].gol=max(max(v[node*2].gol,v[node*2+1].gol),v[node*2].r+v[node*2+1].l);
v[node].l=v[node*2].l;
if(v[node*2].l==mij-left+1)
v[node].l+=v[node*2+1].l;
v[node].r=v[node*2+1].r;
if(v[node*2+1].r==right-mij)
v[node].r+=v[node*2].r;
}
void solve()
{
lf=1;
rg=n;
val=2;
update(1,1,n);
int c;
for(int i=1; i<=p; i++)
{
fscanf(in,"%d",&c);
if(c==1)
{
fscanf(in,"%d %d",&lf,&rg);
rg=lf+rg-1;
val=1;
update(1,1,n);
}
else if(c==2)
{
fscanf(in,"%d %d",&lf,&rg);
rg=lf+rg-1;
val=0;
update(1,1,n);
}
else
{
fprintf(out,"%d\n",v[1].gol);
}
}
}
int main()
{
in=fopen("hotel.in","r");
out=fopen("hotel.out","w");
read();
solve();
return 0;
}