Cod sursa(job #134952)

Utilizator cupacatenumaratecupacatenumarate cupacatenumarate Data 12 februarie 2008 18:53:33
Problema Hotel Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 3.27 kb
#include <stdio.h>

#define NMAX (1<<17)

int A[2*NMAX], B[2*NMAX], C[2*NMAX], T[2*NMAX];
int N, M, P, Q, D;

void update(int p, int q, int nod)
{
        int md = (p+q)>>1, l = nod<<1, x;


        if (P<=p&&q<=Q)
        {
                A[nod] = B[nod] = C[nod] = q-p+1;
                T[nod] = 1;
                return;
        }

        if (p>=q) return;

        if (!C[nod])
           T[nod] = T[l] = T[l+1] = C[l] = C[l+1] = A[l] = A[l+1] = B[l] = B[l+1] = 0;

        if (T[nod])
        {
                T[l] = T[l+1] = 1;
                A[l] = B[l] = C[l] = q-md;
                if (md<N) A[l+1] = B[l+1] = C[l+1] = q-md;
        }

        if ( (p <= P && P <= q) || (p <= Q && Q <= q) )
        {
                update(p, md, l);
                update(md+1, q, l+1);
        }

        //recompute stuff
        
        A[nod] = (A[l]>A[nod])?A[l]:A[nod];
        B[nod] = (B[l+1]>B[nod])?B[l+1]:B[nod];

        x = (md-p+1+A[l+1])*T[l];
        A[nod] = (x>A[nod])?x:A[nod];
        

        x = (B[l]+q-md)*T[l+1];
        B[nod] = (x>B[nod])?x:B[nod]; 

        C[nod] = (C[l]>C[nod])?C[l]:C[nod];
        C[nod] = (C[l+1]>C[nod])?C[l+1]:C[nod];

        x = A[l+1]+B[l];
        C[nod] = (x>C[nod])?x:C[nod];

        T[nod] = T[l]&T[l+1];
}


void update2(int p, int q, int nod)
{
        int md = (p+q)>>1, l = nod<<1, x;

        if (P<=p&&q<=Q)
        {
                A[nod] = B[nod] = C[nod] = T[nod] = 0;
                return;
        }

        if (p>=q) return;

        if (!C[nod])
           T[nod] = T[l] = T[l+1] = C[l] = C[l+1] = A[l] = A[l+1] = B[l] = B[l+1] = 0;

        if (T[nod])
        {
                T[l] = T[l+1] = 1;
                A[l] = B[l] = C[l] = q-md;
                if (md<N) A[l+1] = B[l+1] = C[l+1] = q-md;
        }

        if ( (p <= P && P <= q) || (p <= Q && Q <= q) )
        {
                update2(p, md, l);
                update2(md+1, q, l+1);
        }

        //recompute stuff

        A[nod] = A[l]; B[nod] = B[l+1]; C[nod] = C[l]; T[nod] = 0;

        x = (md-p+1+A[l+1])*T[l];
        A[nod] = (x>A[nod])?x:A[nod];

        x = (B[l]+q-md)*T[l+1];
        B[nod] = (x>B[nod])?x:B[nod]; 

        C[nod] = (C[l+1]>C[nod])?C[l+1]:C[nod];
        x = A[l+1]+B[l];
        C[nod] = (x>C[nod])?x:C[nod];

        T[nod] = T[l]&T[l+1];
}

int main()
{
        int i, t;

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

        scanf("%d %d", &N, &M);

        P = 0; Q = N-1;
        update(0,NMAX-1,1);

        for (i = 0; i < M; i++)
        {
                scanf("%d", &t);
                if (t==1)
                {
                        scanf("%d%d", &P, &D);
                        P--;
                        Q = P+D-1;
                        update2(0,NMAX-1,1);
                }
                
                else
                
                if (t==2)
                {
                        scanf("%d%d", &P, &D);
                        P--;
                        Q = P+D-1;
                        update(0,NMAX-1,1);
                }

                else

                printf("%d\n", C[1]);
        }
        
        return 0;
        
}