Cod sursa(job #2694088)

Utilizator cyg_dawidDavid Ghiberdic cyg_dawid Data 7 ianuarie 2021 23:37:51
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>

using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

int const nmax = 100000;
int aint[4 * nmax + 10];
int ll[4 * nmax + 10]; // length l
int lr[4 * nmax + 10]; // length r
int n, p;

void build(int nod, int st, int dr) {
    aint[nod] = lr[nod] = ll[nod] = dr - st + 1;
    if(st == dr)
        return;
    int med = (st + dr) >> 1;
    build(nod * 2, st, med);
    build(nod * 2 + 1, med + 1, dr);
}

void update(int nod, int st, int dr, int l, int r, bool tip) {
    if(l <= st && dr <= r) {
        int var = (dr - st + 1);
        if(tip == 0) var = 0;
        aint[nod] = ll[nod] = lr[nod] = var;
        return;
    }
    int med = (st + dr) >> 1;
    // if aint[nod] == 0 || dr - st + 1 => aint[nod] got into the above if and its children weren't updated
    // we update the children now:
    if(aint[nod] == 0) {
        aint[nod * 2] = ll[nod * 2] = lr[nod * 2] = 0;
        aint[nod * 2 + 1] = ll[nod * 2 + 1] = lr[nod * 2 + 1] = 0;
    } else if(aint[nod] == dr - st + 1) {
        aint[nod * 2] = ll[nod * 2] = lr[nod * 2] = med - st + 1;
        aint[nod * 2 + 1] = ll[nod * 2 + 1] = lr[nod * 2 + 1] = dr - med;
    }

    if(l <= med)
        update(nod * 2, st, med, l, r, tip);
    if(med < r)
        update(nod * 2 + 1, med + 1, dr, l, r, tip);
    ll[nod] = ll[nod * 2];
    lr[nod] = lr[nod * 2 + 1];
    if(ll[nod] == med - st + 1)
        ll[nod] += ll[nod * 2 + 1];
    if(lr[nod] == dr - med)
        lr[nod] += lr[nod * 2];
    aint[nod] = max(max(aint[nod * 2], aint[nod * 2 + 1]), lr[nod * 2] + ll[nod * 2 + 1]);
}

int main()
{
    fin >> n >> p;
    build(1, 1, n);
    while(p--) {
        int c;
        fin >> c;
        if(c == 3) {
            fout << aint[1] << "\n";
        } else {
            int x, y;
            fin >> x >> y;
            update(1, 1, n, x, x + y - 1, (c == 2));
        }
    }
    return 0;
}