Cod sursa(job #501059)

Utilizator szabibibiOrban Szabolcs szabibibi Data 14 noiembrie 2010 11:41:29
Problema Hotel Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <stdio.h>
#define max(a,b) (a)>(b)?(a):(b)
#define Nmax 4*100000 + 1

long C[Nmax], R[Nmax], L[Nmax];
long n,p,type,a,b;

void up1(long, long, long, long, long);
void up2(long, long, long, long, long);
void init(long, long, long);


int main()
{
    long i;
    freopen("hotel.in", "r", stdin);
    freopen("hotel.out", "w", stdout);

    scanf("%ld %ld", &n, &p);

    init(1,1,n);

    for (i = 1; i<=p; i++)
    {
        scanf("%ld", &type);
        if (type == 3)
        {
            printf("%ld\n", C[1]);
        }
        else
        {
            scanf("%ld %ld", &a, &b);
            if (type == 2)
                    up2(1,1,n,a,a+b-1);
            else
                    up1(1,1,n,a,a+b-1);
        }
    }

    return 0;
}


void init(long cs, long e, long v)
{
    C[cs] = R[cs] = L[cs] = v-e+1;
}

void up1(long cs, long e, long v, long a, long b)
{
    long k = (e+v)/2;
    long m1;
    if (a<=e && b>=v)
    {
        C[cs] = L[cs] = R[cs] = 0;
        return;
    }

    if (C[cs] == v-e+1)
    {
        L[2*cs] = R[2*cs] = C[2*cs] = k-e+1;
        R[2*cs+1] = L[2*cs+1] = C[2*cs+1] = v-k;
    }
    if (a<=k)
        up1(2*cs, e, k, a, b);
    if (b>k)
        up1(2*cs+1, k+1, v, a, b);

    L[cs] = L[2*cs];
    if (L[2*cs] == k-e+1)
        L[cs] += L[2*cs+1];
    R[cs] = R[2*cs+1];
    if (R[2*cs+1] == v-k)
        R[cs] += R[2*cs];
    m1 = max(C[2*cs], C[2*cs+1]);
    m1 = max(m1, L[2*cs+1]+R[2*cs]);
    m1 = max(m1, max(L[cs], R[cs]));
    C[cs] = m1;
}

void up2(long cs, long e, long v, long a, long b)
{
    long k = (e+v)/2;
    long m1;
    if (a<=e && b>=v)
    {
        C[cs] = L[cs] = R[cs] = v-e+1;
        return;
    }
    if (C[cs] == v-e+1)
    {
        L[2*cs] = R[2*cs] = C[2*cs] = k-e+1;
        R[2*cs+1] = L[2*cs+1] = C[2*cs+1] = v-k;
    }
    if (a<=k)
        up2(2*cs, e, k, a, b);
    if (b>k)
        up2(2*cs+1, k+1, v, a, b);

    L[cs] = L[2*cs];
    if (L[2*cs] == k-e+1)
        L[cs] += L[2*cs+1];
    R[cs] = R[2*cs+1];
    if (R[2*cs+1] == v-k)
        R[cs] += R[2*cs];
    m1 = max(C[2*cs], C[2*cs+1]);
    m1 = max(m1, L[2*cs+1]+R[2*cs]);
    m1 = max(m1, max(L[cs], R[cs]));
    C[cs] = m1;
}