Cod sursa(job #2061700)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 9 noiembrie 2017 17:15:11
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct inter {
    int zmax, zst, zdr;
} v[400005];

void init(int nod, int st, int dr, int val) {
    if(val == 2)
        v[nod].zmax = v[nod].zst = v[nod].zdr = dr - st + 1;
    else
        v[nod].zmax = v[nod].zst = v[nod].zdr = 0;
    if(st < dr) {
        int med = (st + dr) / 2;
        init(2 * nod, st, med, val);
        init(2 * nod + 1, med + 1, dr, val);
    }
}

void update(int nod, int st, int dr, int a, int b, int val) {
    if(a <= st && dr <= b) {
        if(val == 2) {
            v[nod].zmax = v[nod].zst = v[nod].zdr = dr - st + 1;
        } else {
            v[nod].zmax = v[nod].zst = v[nod].zdr = 0;
        }
        init(nod, st, dr, val);
    } else {
        int med = (st + dr) / 2;
        if(a <= med) {
            update(2 * nod, st, med, a, b, val);
        }
        if(med + 1 <= b) {
            update(2 * nod + 1, med + 1, dr, a, b, val);
        }

        v[nod].zst = v[2 * nod].zst;
        if(v[2 * nod].zst == v[2 * nod].zdr && v[2 * nod].zst == v[2 * nod].zmax && v[2 * nod].zmax != 0) {
            v[nod].zst += v[2 * nod + 1].zst;
        }
        v[nod].zdr = v[2 * nod + 1].zdr;
        if(v[2 * nod + 1].zdr == v[2 * nod + 1].zst && v[2 * nod + 1].zst == v[2 * nod + 1].zmax && v[2 * nod + 1].zmax != 0) {
            v[nod].zdr += v[2 * nod].zdr;
        }
        v[nod].zmax = max(v[2 * nod].zdr + v[2 * nod + 1].zst, max(v[2 * nod].zmax, v[2 * nod + 1].zmax));
        if(v[nod].zmax > dr - st + 1) {
            v[nod].zmax = v[nod].zst = v[nod].zdr = dr - st + 1;
        }
    }
}

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

    int n, p;
    scanf("%d%d", &n, &p);

    init(1, 1, n, 2);
    for(int i = 1; i <= p; ++ i) {
        int t, x, y;
        scanf("%d", &t);
        if(t == 3) {
            printf("%d\n", v[1].zmax);
        } else {
            scanf("%d%d", &x, &y);
            update(1, 1, n, x, x + y - 1, t);
        }
    }

    return 0;
}