Cod sursa(job #14673)

Utilizator astronomyAirinei Adrian astronomy Data 9 februarie 2007 13:54:16
Problema Hotel Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <stdio.h>

#define MAXARB (1 << 18)
#define left (nod << 1)
#define right ((nod << 1) | 1)
#define mid ((st+dr) >> 1)
#define max(a,b) ((a) > (b) ? (a) : (b))

int N, P, L[MAXARB], R[MAXARB], Max[MAXARB], Nr[MAXARB];

int a, b, type;

void scoate(int nod, int st, int dr)
{
    if(a <= st && dr <= b)
        Max[nod] = L[nod] = R[nod] = 0;
    else
    {
        if(a <= mid) scoate(left, st, mid);
        if(b > mid) scoate(right, mid+1, dr);
        Max[nod] = max(Max[left], Max[right]);
        Max[nod] = max(Max[nod], L[right]+R[left]);
        L[nod] = (L[left] == Nr[left] ? L[left]+L[right] : L[left]);
        R[nod] = (R[right] == Nr[right] ? R[right]+R[left] : R[right]);
    }
}

void baga(int nod, int st, int dr, int tata)
{
    int lst = 0, ldr = 0, rst = 0, rdr = 0, mst = 0, mdr = 0;
    
    if(a <= st && dr <= b)
        Max[nod] = L[nod] = R[nod] = Nr[nod];
    else
    {
        if(tata == 0 || Max[nod] == 0)
        {
            if(a <= mid)
                baga(left, st, mid, 0), lst = L[left], rst = R[left],
                mst = Max[left];
            if(b > mid)
                baga(right, mid+1, dr, 0), ldr = L[right], rdr = R[right],
                mdr = Max[right];
            Max[nod] = max(mst, mdr);
            Max[nod] = max(Max[nod], ldr+rst);
            L[nod] = (lst == Nr[left] ? lst+ldr : lst);
            R[nod] = (rdr == Nr[right] ? rdr+rst : rdr);
        }
        else
        {
            if(a <= mid) baga(left, st, mid, 1);
            if(b > mid) baga(right, mid+1, dr, 1);
            Max[nod] = max(Max[left], Max[right]);
            Max[nod] = max(Max[nod], L[right]+R[left]);
            L[nod] = (L[left] == Nr[left] ? L[left]+L[right] : L[left]);
            R[nod] = (R[right] == Nr[right] ? R[right]+R[left] : R[right]);
        }
    }
}

void init(int nod, int st, int dr)
{
    Max[nod] = L[nod] = R[nod] = Nr[nod] = dr-st+1;
    if(st == dr)
        return ;
    init(left, st, mid), init(right, mid+1, dr);
}

int main(void)
{
    freopen("hotel.in", "rt", stdin);
    freopen("hotel.out", "wt", stdout);

    int i, t, j, k;

    scanf("%d %d\n", &N, &P);

    init(1, 1, N);

    for(i = 1; i <= P; i++)
    {
        scanf("%d ", &t);
        if(t == 1)
            scanf("%d %d\n", &j, &k), a = j, b = j+k-1, scoate(1, 1, N);
        if(t == 2)
            scanf("%d %d\n", &j, &k), a = j, b = j+k-1, baga(1, 1, N, 1);
        if(t == 3)
            printf("%d\n", Max[1]);
    }

    return 0;
}