Pagini recente » Cod sursa (job #2630110) | Cod sursa (job #268622) | Cod sursa (job #2902219) | Cod sursa (job #1860357) | Cod sursa (job #2514455)
#include <fstream>
#include <iostream>
#define NMAX 1700000
using namespace std;
ifstream fin ("hotel.in");
ofstream fout ("hotel.out");
struct nod
{
int nmax,pref,suf,val;
}a[NMAX];
void buildArb(int s,int d,int k)
{
if(s==d)
{
a[k].nmax=a[k].pref=a[k].suf=d-s+1;
return;
}
int m=(s+d)/2;
buildArb(s,m,2*k);
buildArb(m+1,d,2*k+1);
a[k].nmax=a[k].pref=a[k].suf=d-s+1;
}
void update(int x,int y,int val,int s,int d,int k)
{
if(a[k].val==1)
{
a[k].nmax=a[k].pref=a[k].suf=0;
a[2*k].val=a[2*k+1].val=a[k].val;
a[k].val=-1;
}
else
if(a[k].val==0)
{
a[k].nmax=a[k].pref=a[k].suf=d-s+1;
a[2*k].val=a[2*k+1].val=a[k].val;
a[k].val=-1;
}
if(s>y || d<x)
return;
if(s>=x && d<=y)
{
if(val==0)
a[k].nmax=a[k].pref=a[k].suf=d-s+1;
else
a[k].nmax=a[k].pref=a[k].suf=0;
a[2*k].val=a[2*k+1].val=val;
return;
}
int m=(s+d)/2;
update(x,y,val,s,m,2*k);
update(x,y,val,m+1,d,2*k+1);
a[k].nmax=max(max(a[2*k].nmax,a[2*k+1].nmax),a[2*k].suf+a[2*k+1].pref);
a[k].pref=(a[2*k].nmax==m-s+1)? a[2*k].nmax+a[2*k+1].pref:a[2*k].pref;
a[k].suf=(a[2*k+1].nmax==d-m)? a[2*k+1].nmax+a[2*k].suf:a[2*k+1].suf;
}
int main()
{
int n,m;
fin>>n>>m;
buildArb(1,n,1);
while(m--)
{
int v;
fin>>v;
if(v==3)
fout<<a[1].nmax<<'\n';
else
{
int x,y;
fin>>x>>y;
if(v==1)
update(x,x+y-1,1,1,n,1);
else
update(x,x+y-1,0,1,n,1);
}
}
return 0;
}