Cod sursa(job #1060650)

Utilizator heracleRadu Muntean heracle Data 18 decembrie 2013 11:41:30
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.28 kb
#include <cstdio>

int t,n;

struct arbore{
    int prefix,sufix,secvmax;
} arb[1<<18];

void initializ(int p, int st, int dr)
{
    if(st==dr)
    {
        arb[p].prefix=arb[p].sufix=arb[p].secvmax=1;
        return;
    }
    arb[p].prefix=arb[p].sufix=arb[p].secvmax=dr-st+1;
    initializ(2*p,st,(st+dr)/2);
    initializ(2*p+1,(st+dr)/2+1,dr);
}

int max(int a, int b)
{
    return a>b ?a :b;
}

int max(int a, int b, int c)
{
    int h=max(b,c);
    return a> h ? a :h;
}

bool liber=0;
int stint, drint;
void ocup(int p,int st, int dr)
{
    if(liber)
    {
        arb[p].prefix=arb[p].sufix=arb[p].secvmax=dr-st+1;
    }
    if(stint<=st && dr<=drint)
    {
        arb[p].prefix=arb[p].sufix=arb[p].secvmax=0;
        return;
    }
    if(dr<stint || st>drint)
        return;
    if(arb[p].secvmax==dr-st+1 && liber==0)
    {
            liber=1;
            ocup(2*p,st, (st+dr)/2);
            ocup(2*p+1,(st+dr)/2+1, dr);
            liber=0;
    }
    else
    {
        ocup(2*p,st, (st+dr)/2);
        ocup(2*p+1,(st+dr)/2+1, dr);
    }
    arb[p].secvmax=max(arb[2*p].secvmax,arb[2*p+1].secvmax, arb[2*p].sufix+arb[2*p+1].prefix);

    if(arb[2*p].prefix==(st+dr)/2-st+1)
        arb[p].prefix=arb[2*p].prefix+arb[2*p+1].prefix;
    else
        arb[p].prefix=arb[2*p].prefix;

    if(arb[2*p+1].sufix==dr-(st+dr)/2)
        arb[p].sufix=arb[2*p].sufix+arb[2*p+1].sufix;
    else
        arb[p].sufix=arb[2*p+1].sufix;
}


void fill(int st, int dr)
{
    stint=st;
    drint=dr;
    liber=0;
    ocup(1,1,n);
}

bool plin=0;

void eliberez(int p, int st, int dr)
{
    if(plin)
    {
        arb[p].prefix=arb[p].sufix=arb[p].secvmax=0;
    }
    if(stint<=st && dr<=drint)
    {
        arb[p].prefix=arb[p].sufix=arb[p].secvmax=dr-st+1;
        return;
    }
    if(dr<stint || st>drint)
        return;


    if(arb[p].secvmax==0 && plin==0)
    {
            plin=1;
            eliberez(2*p,st, (st+dr)/2);
            eliberez(2*p+1,(st+dr)/2+1, dr);
            plin=0;
    }
    else
    {
        eliberez(2*p,st, (st+dr)/2);
        eliberez(2*p+1,(st+dr)/2+1, dr);
    }


    arb[p].secvmax=max(arb[2*p].secvmax,arb[2*p+1].secvmax, arb[2*p].sufix+arb[2*p+1].prefix);

    if(arb[2*p].prefix==(st+dr)/2-st+1)
        arb[p].prefix=arb[2*p].prefix+arb[2*p+1].prefix;
    else
        arb[p].prefix=arb[2*p].prefix;

    if(arb[2*p+1].sufix==dr-(st+dr)/2)
        arb[p].sufix=arb[2*p].sufix+arb[2*p+1].sufix;
    else
        arb[p].sufix=arb[2*p+1].sufix;


}




void empty(int st, int dr)
{
    plin=0;
    stint=st;
    drint=dr;
    eliberez(1,1,n);

}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);

    scanf("%d%d",&n,&t);

    //initializ(1,1,n);
    arb[1].secvmax=arb[1].sufix=arb[1].prefix=n;
    int var,membr,init;
    for(int i=1; i<=t; i++)
    {
        scanf("%d",&var);
        if(var==1)
        {
            scanf("%d%d",&init,&membr);
            fill(init, init+membr-1);
        }
        if(var==2)
        {
            scanf("%d%d",&init,&membr);
            empty(init,init+membr-1);
        }
        if(var==3)
        {
            printf("%d\n",arb[1].secvmax);
        }
    }
    return 0;
}