Cod sursa(job #3304145)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 21 iulie 2025 10:55:02
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.17 kb
#include <bits/stdc++.h>

using namespace std;

#define ST_DIO 1
#if ST_DIO
    #define fin cin
    #define fout cout
#else
    ifstream fin("hotel.in");
    ofstream fout("hotel.out");
#endif  // ST_DIO

struct Nod {
    int sum, pref, suff;
} aint[400002];
int lazy[400002];
int n, q, i;

static inline pair<int, int> NodUrm(int nod, int st, int dr) {
    int mij = st + (dr - st) / 2;
    int nodSt = 2 * nod;
    int nodDr = 2 * nod + 1;

    return pair<int, int>{nodSt, nodDr};
}

static inline Nod Add(Nod a, Nod b, int st, int dr) {
    int mij = st + (dr - st) / 2;
    int lungSt = mij - st + 1;
    int lungDr = dr - mij;

    Nod c = Nod{0, a.pref, b.suff};
    if(a.pref == lungSt) c.pref += b.pref;
    if(b.suff == lungDr) c.suff += a.suff;

    c.sum = max({a.sum, b.sum, a.suff + b.pref});

    return c;
}

static inline void SpreadLazy(int nod, int st, int dr) {
    if(lazy[nod] == 0) return;

    int nodSt, nodDr;
    tie(nodSt, nodDr) = NodUrm(nod, st, dr);

    if(lazy[nod] == 1) {
        aint[nodSt] = aint[nodDr] = {0, 0, 0};
        lazy[nodSt] = lazy[nodDr] = 1;
    }
    else if(lazy[nod] == 2) {
        int mij = st + (dr - st) / 2;
        int lungSt = mij - st + 1;
        int lungDr = dr - mij;

        aint[nodSt] = {lungSt, lungSt, lungSt};
        aint[nodDr] = {lungDr, lungDr, lungDr};
        lazy[nodSt] = lazy[nodDr] = 2;
    }

    lazy[nod] = 0;
}

static inline void Build(int nod, int st, int dr) {
    if(st == dr) aint[nod] = {1, 1, 1};
    else {
        int mij = st + (dr - st) / 2;

        int nodSt, nodDr;
        tie(nodSt, nodDr) = NodUrm(nod, st, dr);

        Build(nodSt, st, mij);
        Build(nodDr, mij + 1, dr);

        aint[nod] = Add(aint[nodSt], aint[nodDr], st, dr);
    }
}

static inline void Update(int nod, int st, int dr, int qst, int qdr, int val) {
    if(qst <= st && dr <= qdr) {
        if(val == 0) {
            aint[nod] = {0, 0, 0};
            lazy[nod] = 1;
        }
        else {
            int lung = dr - st + 1;
            aint[nod] = {lung, lung, lung};
            lazy[nod] = 2;
        }
    }
    else {
        int mij = st + (dr - st) / 2;

        int nodSt, nodDr;
        tie(nodSt, nodDr) = NodUrm(nod, st, dr);

        SpreadLazy(nod, st, dr);

        if(qst <= mij) Update(nodSt, st, mij, qst, qdr, val);
        if(mij <  qdr) Update(nodDr, mij + 1, dr, qst, qdr, val);

        aint[nod] = Add(aint[nodSt], aint[nodDr], st, dr);
    }
}

static inline void Precalc() {}
static inline void Test() {
    fin >> n >> q;
    Build(1, 1, n);
    while(q--) {
        int op;
        fin >> op;
        if(op == 1) {
            int x, y;
            fin >> x >> y;
            Update(1, 1, n, x, x + y - 1, 0);
        }
        else if(op == 2) {
            int x, y;
            fin >> x >> y;
            Update(1, 1, n, x, x + y - 1, 1);
        }
        else fout << aint[1].sum << "\n";
    }
}

int main() {
    if(ST_DIO) ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    Precalc();
    int t = 1;
    //fin >> t;
    while(t--) Test();

    return 0;
}