Pagini recente » Cod sursa (job #869430) | Cod sursa (job #1259695) | Cod sursa (job #2795980) | Clasament tt | Cod sursa (job #332084)
Cod sursa(job #332084)
#include <stdio.h>
#define file_in "hotel.in"
#define file_out "hotel.out"
#define Nmax 500010
struct arbint
{
int st,dr,sum;
}ai[Nmax];
int n,m;
int x,y,tip;
void citire()
{
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d", &n,&m);
}
void build(int nod, int st, int dr)
{
int mij=(st+dr)>>1;
ai[nod].st=ai[nod].dr=ai[nod].sum=dr-st+1;
if (st==dr)
return ;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
}
void update(int nod, int st, int dr)
{
int mij=(st+dr)>>1;
if (x<=st && dr<=y)
{
if (tip==1)
{
ai[nod].st=ai[nod].dr=ai[nod].sum=0;
}
else
{
ai[nod].st=ai[nod].dr=ai[nod].sum=dr-st+1;
}
return ;
}
if (tip==1 && ai[nod].sum==dr-st+1)
{
ai[2*nod].st=ai[2*nod].dr=ai[2*nod].sum=mij-st+1;
ai[2*nod+1].st=ai[2*nod+1].dr=ai[2*nod+1].sum=dr-mij;
}
if (tip==2 && ai[nod].sum==0)
{
ai[2*nod].st=ai[2*nod].dr=ai[2*nod].sum=0;
ai[2*nod+1].st=ai[2*nod+1].dr=ai[2*nod+1].sum=0;
}
if (x<=mij)
update(2*nod,st,mij);
if (mij<y)
update(2*nod+1,mij+1,dr);
if (ai[2*nod].sum==mij-st+1)
{
ai[nod].st=ai[2*nod].sum+ai[2*nod+1].st;
}
else
{
ai[nod].st=ai[2*nod].st;
}
if (ai[2*nod+1].sum==dr-mij)
{
ai[nod].dr=ai[2*nod+1].sum+ai[2*nod].dr;
}
else
{
ai[nod].dr=ai[2*nod+1].dr;
}
ai[nod].sum=ai[2*nod+1].st+ai[2*nod].dr;
if (ai[nod].dr>ai[nod].sum)
ai[nod].sum=ai[nod].dr;
if (ai[nod].st>ai[nod].sum)
ai[nod].sum=ai[nod].st;
if (ai[2*nod].sum>ai[nod].sum)
ai[nod].sum=ai[2*nod].sum;
if (ai[2*nod+1].sum>ai[nod].sum)
ai[nod].sum=ai[2*nod+1].sum;
}
int main()
{
int i;
citire();
build(1,1,n);
for (i=1;i<=m;++i)
{
scanf("%d", &tip);
if (tip==1 || tip==2)
{
scanf("%d %d", &x,&y);
y=y+x-1;
update(1,1,n);
}
else
printf("%d\n", ai[1].sum);
}
/*printf("%d", ai[1].sum);*/
fclose(stdin);
fclose(stdout);
return 0;
}