Cod sursa(job #825756)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 29 noiembrie 2012 15:26:06
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include<cstdio>
#define max(a,b) a>b?a:b
void build(int,int,int),update(int,int,int),goleste(int,int,int);
int n,m,t,CURR[300010],ST[300010],DR[300010],st,x,fn;
int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&n,&m);
    build(1,n,1);
    for(;m;--m)
    {
        scanf("%d",&t);
        if(t==3)printf("%d\n",CURR[1]);
        if(t==1)
        {
            scanf("%d%d",&st,&x);
            fn=st+x-1;
            update(1,n,1);
        }
        if(t==2)
        {
            scanf("%d%d",&st,&x);
            fn=st+x-1;
            goleste(1,n,1);
        }
    }
}
void build(int X,int Y,int cnt)
{
    CURR[cnt]=Y-X+1;
    ST[cnt]=Y-X+1; //incepe in X
    DR[cnt]=Y-X+1; // se termina in Y
    if(Y==X)return;
    int mij=(Y+X)/2;
    build(X,mij,cnt+cnt);
    build(mij+1,Y,cnt+cnt+1);
}
void update(int X,int Y,int cnt)
{
    if(st<=X&&Y<=fn)
    {
        CURR[cnt]=0;
        ST[cnt]=0;
        DR[cnt]=0;
        if(X==Y)return;
        int mij=(X+Y)/2;
        update(X,mij,cnt+cnt);
        update(mij+1,Y,cnt+cnt+1);
    }
    else
    {
        int mij=(X+Y)/2;
        if(st<=mij)update(X,mij,cnt+cnt);
        if(fn>=mij+1)update(mij+1,Y,cnt+cnt+1);
        CURR[cnt]=max(CURR[cnt+cnt],CURR[cnt+cnt+1]);
        CURR[cnt]=max(CURR[cnt],ST[cnt+cnt+1]+DR[cnt+cnt]);
        if(ST[cnt+cnt]==mij-X+1)ST[cnt]=ST[cnt+cnt]+ST[cnt+cnt+1]; else ST[cnt]=ST[cnt+cnt];
        if(DR[cnt+cnt+1]==Y-mij)DR[cnt]=DR[cnt+cnt]+DR[cnt+cnt+1]; else DR[cnt]=DR[cnt+cnt+1];
    }
}
void goleste(int X,int Y,int cnt)
{
    if(st<=X&&Y<=fn)
    {
        CURR[cnt]=Y-X+1;
        ST[cnt]=Y-X+1;
        DR[cnt]=Y-X+1;
        if(X==Y)return;
        int mij=(X+Y)/2;
        goleste(X,mij,cnt+cnt);
        goleste(mij+1,Y,cnt+cnt+1);
    }
    else
    {
        int mij=(X+Y)/2;
        if(st<=mij)goleste(X,mij,cnt+cnt);
        if(fn>=mij+1)goleste(mij+1,Y,cnt+cnt+1);
        CURR[cnt]=max(CURR[cnt+cnt],CURR[cnt+cnt+1]);
        CURR[cnt]=max(CURR[cnt],ST[cnt+cnt+1]+DR[cnt+cnt]);
        if(ST[cnt+cnt]==mij-X+1)ST[cnt]=ST[cnt+cnt]+ST[cnt+cnt+1]; else ST[cnt]=ST[cnt+cnt];
        if(DR[cnt+cnt+1]==Y-mij)DR[cnt]=DR[cnt+cnt]+DR[cnt+cnt+1]; else DR[cnt]=DR[cnt+cnt+1];
    }
}