Cod sursa(job #973099)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 13 iulie 2013 14:27:51
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int DMAX = 1000003;
int st, dr;
bool h;
struct Aint {

    int m, l, r;

}aint[DMAX << 1];

void AINT_build (const int l, const int r, const int nod) {

    if (l == r) {
        aint[nod].m = aint[nod].l = aint[nod].r = 1;
        return;
    }
    const int m = (l + r) >> 1;
    aint[nod].m = aint[nod].l = aint[nod].r = r - l + 1;
    AINT_build (l, m, nod * 2);
    AINT_build (m + 1, r, nod * 2 + 1);

}

void AINT_update (const int l, const int r, const int nod) {

    if (dr < l || st > r)
        return;
    const int m = (l + r) >> 1;
    if (st <= l && r <= dr) {
        aint[nod].m = aint[nod].l = aint[nod].r = h ? r - l + 1 : 0;
        return;
    }
    AINT_update (l, m, nod * 2);
    AINT_update (m + 1, r, nod * 2 + 1);
    aint[nod].l = aint[nod * 2].l != m - l + 1 ? aint[nod * 2].l : aint[nod * 2].l + aint[nod * 2 + 1].l;
    aint[nod].r = aint[nod * 2 + 1].r != r - m ? aint[nod * 2 + 1]. r : aint[nod * 2 + 1].r + aint[nod * 2].r;
    aint[nod].m = max(max(max(aint[nod].l, aint[nod].r), max(aint[nod * 2].m, aint[nod * 2 + 1].m)), aint[nod * 2].r + aint[nod * 2 + 1].l);

}

int main () {

    freopen ("hotel.in", "r", stdin);
    freopen ("hotel.out", "w", stdout);
    int N, P, t, a, b;
    scanf ("%d%d", &N, &P);
    AINT_build (1, N, 1);
    while (P--) {
        scanf ("%d", &t);
        if (t == 1) {
            scanf ("%d%d", &a, &b);
            st = a;
            dr = a + b - 1;
            h = 0;
            AINT_update (1, N, 1);
            continue;
        }
        if (t == 2) {
            scanf ("%d%d", &a, &b);
            st = a;
            dr = a + b - 1;
            h = 1;
            AINT_update (1, N, 1);
            continue;
        }
        printf ("%d\n", aint[1].m);
    }

}