Cod sursa(job #589421)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 12 mai 2011 10:32:08
Problema Hotel Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.32 kb
#include <cstdio>

struct ai_val {
    int lung, st, end;

    int deprop; // 0 - nu propag; 1 - propag 1; 2 - propag 0
};

const int N_Max = 100005;

int N;

ai_val ai[5 * N_Max];

void propaga(int nod, int pi, int pf) {
    int mij = (pi + pf) / 2;

    if (ai[nod].deprop == 1) {
        ai[2 * nod].lung = 0;
        ai[2 * nod].st = 0;
        ai[2 * nod].end = 0;
        ai[2 * nod].deprop = 1;

        ai[2 * nod + 1].lung = 0;
        ai[2 * nod + 1].st = 0;
        ai[2 * nod + 1].end = 0;
        ai[2 * nod + 1].deprop = 1;
    } else {
        ai[2 * nod].lung = mij - pi + 1;
        ai[2 * nod].st = mij - pi + 1;
        ai[2 * nod].end = mij - pi + 1;
        ai[2 * nod].deprop = 2;

        ai[2 * nod + 1].lung = pf - mij;
        ai[2 * nod + 1].st = pf - mij;
        ai[2 * nod + 1].end = pf - mij;
        ai[2 * nod + 1].deprop = 2;
    }

    ai[nod].deprop = 0;
}

inline int max(int x, int y) {
    return x < y ? y : x;
}

void dinam(int nod, int pi, int pf) {
    int mij = (pi + pf) / 2;

    ai[nod].lung = max(ai[2 * nod].end + ai[2 * nod + 1].st, max(ai[2 * nod].lung, ai[2 * nod + 1].lung));
    ai[nod].st = ai[2 * nod].st;
    if (ai[nod].st == mij - pi + 1)
        ai[nod].st += ai[2 * nod + 1].st;
    ai[nod].end = ai[2 * nod + 1].end;
    if (ai[nod].end == pf - mij)
        ai[nod].end += ai[2 * nod].end;
}

void insert(int nod, int pi, int pf, int sti, int endi) {
    if (ai[nod].deprop)
        propaga(nod, pi, pf);

    if (pf < sti || pi > endi)
        return;

    if (sti <= pi && pf <= endi) {
        ai[nod].lung = 0;
        ai[nod].st = 0;
        ai[nod].end = 0;
        ai[nod].deprop = 1;

        return;
    }

    int mij = (pi + pf) / 2;

    insert(2 * nod, pi, mij, sti, endi);
    insert(2 * nod + 1, mij + 1, pf, sti, endi);

    dinam(nod, pi, pf);
}

void erase(int nod, int pi, int pf, int sti, int endi) {
    if (ai[nod].deprop)
        propaga(nod, pi, pf);

    if (pf < sti || pi > endi)
        return;

    if (sti <= pi && pf <= endi) {
        ai[nod].lung = pf - pi + 1;
        ai[nod].st = pf - pi + 1;
        ai[nod].end = pf - pi + 1;
        ai[nod].deprop = 2;

        return;
    }

    int mij = (pi + pf) / 2;

    erase(2 * nod, pi, mij, sti, endi);
    erase(2 * nod + 1, mij + 1, pf, sti, endi);

    dinam(nod, pi, pf);
}

void solve() {
    int M, pi, lung, type;

    scanf("%d", &M);

    for (int i = 1; i <= M; ++ i) {
        scanf("%d", &type);

        if (type == 1) {
            scanf("%d%d", &pi, &lung);

            insert(1, 1, N, pi, pi + lung - 1);

            continue;
        }

        if (type == 2) {
            scanf("%d%d", &pi, &lung);

            erase(1, 1, N, pi, pi + lung - 1);

            continue;
        }

        printf("%d\n", ai[1].lung);
    }
}

void init(int nod, int pi, int pf) {
    ai[nod].lung = pf - pi + 1;
    ai[nod].st = pf - pi + 1;
    ai[nod].end = pf - pi + 1;
    ai[nod].deprop = 0;

    if (pi == pf)
        return;

    int mij = (pi + pf) / 2;

    init(2 * nod, pi, mij);
    init(2 * nod + 1, mij + 1, pf);
}

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

    scanf("%d", &N);

    init(1, 1, N);

    solve();

    return 0;
}