Cod sursa(job #3132503)

Utilizator HandoMihnea-Vicentiu Hando Data 22 mai 2023 21:53:38
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <bits/stdc++.h>
 
using namespace std;
 
inline void Open(const string Name) {
    #ifndef ONLINE_JUDGE
        (void)!freopen((Name + ".in").c_str(), "r", stdin);
        (void)!freopen((Name + ".out").c_str(), "w", stdout);
    #endif
}
    
struct data {
    int pref, suff, ans;
} t[400001];
 
bitset <400001> marked;
 
int a[100001];
int N, Q, Task, l, r;
 
data combine(const data &a, const data &b, int tm, int tl, int tr){
    data res;
    res.ans = max({a.ans, b.ans, a.suff + b.pref});
    res.pref = max(a.pref, a.pref + (a.pref == tm - tl + 1) * b.pref);
    res.suff = max(b.suff, b.suff + a.suff * (b.suff == tr - tm));
    return res;
}
 
void push(int v, int tl, int tr) {
    if(marked[v]) {
        int tm = (tr + tl) / 2;
        if(t[v].ans != 0) {
            t[v << 1] = {tm - tl + 1, tm - tl + 1, tm - tl + 1};
            t[v << 1 | 1] = {tr - tm, tr - tm, tr - tm};
        } else {
            t[v << 1] = {0, 0, 0};
            t[v << 1 | 1] = {0, 0, 0};
        }

        marked[v] = 0;
        marked[v << 1] = marked[v << 1 | 1] = 1;
    }
}

void build(int v, int tl, int tr){
    if(tl == tr) {
        t[v] = {tr - tl + 1, tr - tl + 1, tr - tl + 1};
    } else {
        int tm = (tl + tr) >> 1;
        build(v << 1, tl, tm);
        build(v << 1 | 1, tm + 1, tr);
        t[v] = combine(t[v << 1], t[v << 1 | 1], tm, tl, tr);
    }
}
 
void update(int v, int tl, int tr, int l, int r, int new_val) {
    if(l > r)
        return;
    if(l == tl && tr == r) {
        if(new_val == 0) t[v] = {0, 0, 0};
        else t[v] = {tr - tl + 1, tr - tl + 1, tr - tl + 1};
        marked[v] = 1;
    } else {
        push(v, tl, tr);
        int tm = (tl + tr) / 2;
        update(v << 1, tl, tm, l, min(r, tm), new_val);
        update(v << 1 | 1, tm + 1, tr, max(l, tm + 1), r, new_val);
        t[v] = combine(t[v << 1], t[v << 1 | 1], tm, tl, tr);
    }
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    Open("hotel");
 
    cin >> N >> Q;
    build(1, 1, N);
 
    while(Q--) {
        cin >> Task;
        if(Task == 1) {
            cin >> l >> r;
            update(1, 1, N, l, l + r - 1, 0);
        }
 
        if(Task == 2) {
            cin >> l >> r;
            update(1, 1, N, l, l + r - 1, 1);
        }
 
        if(Task == 3) {
           cout << t[1].ans << "\n";
        }
    }
 
    return 0;