Pagini recente » Cod sursa (job #1438843) | Cod sursa (job #76495) | Cod sursa (job #1767038) | Cod sursa (job #1016584) | Cod sursa (job #2149334)
#include <cstdio>
#include <iostream>
#define MAXN 100001
struct arbore
{
int left,right,smax;
bool cobor;
}aint[4*MAXN];
int x,y,tip;
void update(int p,int st,int dr)
{
if(x<=st && dr<=y)
{
aint[p].smax=aint[p].left=aint[p].right=tip*(st-dr+1);
aint[p].cobor=true;
}
else
{
int m=(st+dr)>>1;
if(aint[p].cobor)
{
aint[2*p].smax=aint[2*p].left=aint[2*p].right=(aint[p].smax!=0)*(m-st+1);
aint[2*p+1].smax=aint[2*p+1].left=aint[2*p+1].right=(aint[p].smax!=0)*(dr-m);
aint[2*p].cobor=aint[2*p+1].cobor=true;
aint[p].cobor=false;
}
if(x<=m)
update(2*p,st,m);
if(y>m)
update(2*p+1,m+1,dr);
aint[p].smax=std::max(aint[2*p].smax,aint[2*p+1].smax);
aint[p].smax=std::max(aint[p].smax,aint[2*p].right+aint[2*p+1].left);
aint[p].left=aint[2*p].left;
if(aint[2*p].left==m-st+1)
aint[p].left+=aint[2*p+1].left;
aint[p].right=aint[2*p+1].right;
if(aint[2*p+1].right==dr-m)
aint[p].right+=aint[2*p].right;
}
}
void dfs(int p,int st,int dr)
{
if(st==dr)
aint[p].left=aint[p].right=aint[p].smax=1;
else
{
int m=(st+dr)>>1;
dfs(2*p,st,m);
dfs(2*p+1,m+1,dr);
aint[p].smax=aint[p].left=aint[p].right=aint[2*p].smax+aint[2*p+1].smax;
}
}
int main()
{
FILE *fin,*fout;
fin=fopen("hotel.in","r");
fout=fopen("hotel.out","w");
int n,p;
fscanf(fin,"%d%d",&n,&p);
dfs(1,1,n);
for(int i=0;i<p;i++)
{
fscanf(fin,"%d",&tip);
if(tip==3)
fprintf(fout,"%d\n",aint[1].smax);
else
{
fscanf(fin,"%d%d",&x,&y);
y+=x-1;tip--;
update(1,1,n);
}
}
fclose(fin);
fclose(fout);
return 0;
}