Cod sursa(job #3341680)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 20 februarie 2026 17:10:28
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.03 kb
#include <bits/stdc++.h>
#define ll long long

using namespace std;

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

const int NMAX = 1e5;

int n, q;

struct TreeNode {
    int max_subsecv_len;
    int max_prefix_len;
    int max_suffix_len;
    bool is_full;

    TreeNode() : max_subsecv_len(0), max_prefix_len(0), max_suffix_len(0), is_full(0) {}
    TreeNode(int x) {
        max_subsecv_len = max_prefix_len = max_suffix_len = is_full = !x;
    }
};

struct AINT {
    TreeNode aint[4 * NMAX + 1];
    int lazy[4 * NMAX + 1];

    TreeNode update_node(TreeNode left, TreeNode right) {
        TreeNode answer;
        answer.max_subsecv_len = max({left.max_subsecv_len, right.max_subsecv_len, left.max_suffix_len + right.max_prefix_len});
        answer.max_prefix_len = left.max_prefix_len + (left.is_full ? right.max_prefix_len : 0);
        answer.max_suffix_len = right.max_suffix_len + (right.is_full ? left.max_suffix_len : 0);
        answer.is_full = left.is_full & right.is_full;
        return answer;
    }

    void apply_lazy(int node, int left, int right, int p_lazy) {
        if(p_lazy == -1) {
            return;
        }
        aint[node].is_full = aint[node].max_prefix_len = aint[node].max_suffix_len = aint[node].max_subsecv_len = (p_lazy ? 0 : right - left + 1);
        lazy[node] = p_lazy;
    }

    void push_lazy(int node, int left, int right) {
        int mid = (left + right) / 2;
        apply_lazy(node * 2, left, mid, lazy[node]);
        apply_lazy(node * 2 + 1, mid + 1, right, lazy[node]);
        lazy[node] = -1;
    }

    void build(int node, int left, int right) {
        lazy[node] = -1;
        if(left == right) {
            aint[node] = TreeNode(0);
            return;
        }
        int mid = (left + right) / 2;
        build(node * 2, left, mid);
        build(node * 2 + 1 , mid + 1, right);
        aint[node] = update_node(aint[node * 2], aint[node * 2 + 1]);
    }

    void update(int node, int left, int right, int uleft, int uright, int value) {
        if(left > uright || right < uleft) {
            return;
        }
        if(left >= uleft && right <= uright) {
            apply_lazy(node, left, right, value);
            return;
        }
        push_lazy(node, left, right);
        int mid = (left + right) / 2;
        update(node * 2, left, mid, uleft, uright, value);
        update(node * 2 + 1, mid + 1, right, uleft, uright, value);
        aint[node] = update_node(aint[node * 2], aint[node * 2 + 1]);
    }
}aint;

int main() {
    fin >> n >> q;

    aint.build(1, 1, n);
    while(q--) {
        int type;
        fin >> type;
        if(type == 1) {
            int x, y;
            fin >> x >> y;
            aint.update(1, 1, n, x, x + y - 1, 1);
        }
        else if(type == 2) {
            int x, y;
            fin >> x >> y;
            aint.update(1, 1, n, x, x + y - 1, 0);
        }
        else {
            fout << aint.aint[1].max_subsecv_len << '\n';
        }
    }
    return 0;
}