Cod sursa(job #134945)

Utilizator cupacatenumaratecupacatenumarate cupacatenumarate Data 12 februarie 2008 18:42:16
Problema Hotel Scor 80
Compilator c Status done
Runda Arhiva de probleme Marime 3.45 kb
#include <stdio.h>

#define NMAX (1<<17)
#define MIN(a,b) (((a)<(b))?(a):(b))
#define INF 1666000666

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

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]==0)
        {
                T[nod] = T[l] = T[l+1] = 0;
                C[l] = C[l+1] = A[l] = A[l+1] = B[l] = B[l+1] = 0;
        }

        if (T[nod]==1)
        {
                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];
        if ((T[l])&&(A[nod]<(md-p+1+A[l+1]))) A[nod] = md-p+1+A[l+1];
        B[nod] = B[l+1];
        if ((T[l+1])&&(B[nod]<(B[l]+q-md))) B[nod] = B[l]+q-md;
        C[nod] = C[l];
        if (C[nod]<C[l+1]) C[nod] = C[l+1];
        if (C[nod]<(B[l]+A[l+1])) C[nod] = A[l+1]+B[l];
        T[nod] = 0;
        if ((T[l]==T[l+1])&&(T[l])) T[nod] = 1;
}

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


        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]==0)
        {
                T[nod] = T[l] = T[l+1] = 0;
                C[l] = C[l+1] = A[l] = A[l+1] = B[l] = B[l+1] = 0;
        }

        if (T[nod]==1)
        {
                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
        
        if (A[nod]<A[l]) A[nod] = A[l];
        if ((T[l])&&(A[nod]<(md-p+1+A[l+1]))) A[nod] = md-p+1+A[l+1];
        if (B[nod]<B[l+1]) B[nod] = B[l+1];
        if ((T[l+1])&&(B[nod]<(B[l]+q-md))) B[nod] = B[l]+q-md;
        if (C[nod]<C[l]) C[nod] = C[l];
        if (C[nod]<C[l+1]) C[nod] = C[l+1];
        if (C[nod]<(B[l]+A[l+1])) C[nod] = A[l+1]+B[l];
        if ((T[l]==T[l+1])&&(T[l])) T[nod] = 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;
                        if (Q>=N) Q = N-1;
                        update(0,NMAX-1,1);
                }

                else

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