Cod sursa(job #1660269)

Utilizator Pintilie_AndreiFII-Pintilie Andrei Pintilie_Andrei Data 22 martie 2016 22:15:10
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#define nmax 400000

int n, p, v[nmax], l[nmax], r[nmax], st, dr;

void update(int nod, int a, int b, int c)
{
    if (st<=a && b<=dr)
    {
        if (c==1) l[nod]=r[nod]=v[nod]=0; else
            l[nod]=r[nod]=v[nod]=b-a+1;
    } else
    {
        int m=(a+b)/2;
        if (!v[nod]) v[2*nod]=v[2*nod+1]=l[2*nod]=l[2*nod+1]=r[2*nod]=r[2*nod+1]=0; else
            if (v[nod]==b-a+1)
            {
                v[2*nod]=l[2*nod]=r[2*nod]=m-a+1;
                v[2*nod+1]=l[2*nod+1]=r[2*nod+1]=b-m;
            }
        if (st<=m) update(2*nod, a, m, c);
        if (m<dr) update(2*nod+1, m+1, b, c);
        l[nod]=l[2*nod];
        if (l[nod]==m-a+1) l[nod]+=l[2*nod+1];
        r[nod]=r[2*nod+1];
        if (r[nod]==b-m) r[nod]+=r[2*nod];
        v[nod]=r[2*nod]+l[2*nod+1];
        if (v[2*nod]>v[nod]) v[nod]=v[2*nod];
        if (v[2*nod+1]>v[nod]) v[nod]=v[2*nod+1];
    }
}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d %d",&n,&p);
    int c, i;
    v[1]=l[1]=r[1]=n;
    while (p--)
    {
        scanf("%d",&c);
        if (c==1)
        {
            scanf("%d %d",&st,&dr);
            dr+=st-1;
            update(1, 1, n, 1);
        } else
        if (c==2)
        {
            scanf("%d %d",&st, &dr);
            dr+=st-1;
            update(1, 1, n, 2);
        }  else
            printf("%d\n",v[1]);
    }
}