Cod sursa(job #65728)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 11 iunie 2007 20:13:23
Problema Hotel Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <stdio.h>
#define TMAX (1<<17)
#define l (nod<<1)
#define r (1+(nod<<1))
#define mij ( (p1+p2)>>1 )

int T[TMAX<<1], N, M, P, Q;
int St[TMAX<<1], Dr[TMAX<<1];

void up(int x)
{
        int nod = x;

        while (nod>1)
        {
                nod = nod>>1;
                T[nod] = T[l]; St[nod] = St[l]; Dr[nod] = Dr[l];
                if (T[nod]<T[r])
                   T[nod] = T[r], St[nod] = St[r], Dr[nod] = Dr[r];
                if (Dr[l]==(St[r]-1))
                {
                   T[nod] = Dr[r]-St[l]+1;
                   St[nod] = St[l];
                   Dr[nod] = Dr[r];
                }
        }
}

void erase(int p1, int p2, int nod)
{
        T[nod] = St[nod] = Dr[nod] = 0;
        if (p1==p2) return;
        erase(p1, mij, l);
        erase(mij+1, p2, r);
}

void fill(int p1, int p2, int nod)
{
        T[nod] = p2-p1+1; St[nod] = p1; Dr[nod] = p2;
        if (p1==p2) return;
        fill(p1, mij, l);
        fill(mij+1, p2, r);
}

void find(int p1, int p2, int nod, int q)
{
        if (p1>p2) return;
        
        if (P <= p1 && p2 <= Q)
        {
                if (q==2) fill(p1,p2,nod);
                else erase(p1,p2,nod);
                up(nod);
                return;
        }

        if ( (p1 <= P && P <= p2) || (p1 <= Q && Q <= p2) )
        {
                find(p1, mij, l, q);
                find(mij+1, p2, r, q);
        }
}

int main()
{
        int q;

        freopen("hotel.in", "r", stdin);
        freopen("hotel.out", "w", stdout);
        scanf("%d %d", &N, &M);

        for (q = 0; q < N; q++) T[q+TMAX] = 1, St[q+TMAX] = Dr[q+TMAX] = q;
        for (q = 0; q < N; q++) up(q+TMAX);

        for (;M;--M)
        {
                scanf("%d", &q);
                if (q == 3)
                { printf("%d\n", T[1]); continue; }
                scanf("%d %d", &P, &Q);
                P--;
                Q = P+Q-1;
                find(0,TMAX-1,1,q);
        }

        return 0;
        
}