Cod sursa(job #2694086)

Utilizator cyg_dawidDavid Ghiberdic cyg_dawid Data 7 ianuarie 2021 23:35:04
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 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;
        int med = (st + dr) >> 1;
        if(st != dr) {
            update(nod * 2, st, med, l, r, tip);
            update(nod * 2 + 1, med + 1, dr, l, r, tip);
        }
        return;
    }
    int med = (st + dr) >> 1;
    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;
}