Cod sursa(job #3332483)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 6 ianuarie 2026 22:16:23
Problema Hotel Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <bits/stdc++.h>
#define int long long
#define cin ci
#define cout co
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
const int Nmax = 1e5;
const int inf = 1e9;
int n;
struct TreeNode
{
    int seg, pref, suf;
    /*friend TreeNode operator + (const TreeNode &a,  const TreeNode &b)
    {
        TreeNode node;
        node.sum = a.sum + b.sum;
        node.pref = max(a.pref, a.sum + b.pref);
        node.suf = max(b.suf, a.suf + b.sum);
        node.seg = max({a.seg, b.seg, a.suf + b.pref});

        return node;
    }*/
};
TreeNode tree[4 * Nmax + 5];
int lazy[4 * Nmax + 5];
void build(int node, int left, int right)
{
    if(left == right)
    {
        tree[node].pref = tree[node].suf = tree[node].seg = 1;
        return;
    }

    int mij = (left + right) / 2;

    build(2 * node, left, mij);
    build(2 * node + 1, mij + 1, right);

    tree[node].pref = tree[node].suf = tree[node].seg = right - left + 1;
}
void propagate(int node, int left, int right)
{
    if(!lazy[node])
        return;

    if(lazy[node] == 1)
        tree[node].pref = tree[node].suf = tree[node].seg = 0;
    else
        tree[node].pref = tree[node].suf = tree[node].seg = right - left + 1;

    if(left != right)
    {
        lazy[2 * node] = lazy[node];
        lazy[2 * node + 1] = lazy[node];
    }
    lazy[node] = 0;
}
void update(int node, int left, int right, int start, int fin, int val)
{
    propagate(node, left, right);
    if(start <= left && right <= fin)
    {
        lazy[node] = val;
        return;
    }
    int mij = (left + right) / 2;

    if(start <= mij)
        update(2 * node, left, mij, start, fin, val);
    if(mij < fin)
        update(2 * node + 1, mij + 1, right, start, fin, val);

    propagate(2 * node, left, mij);
    propagate(2 * node + 1, mij + 1, right);

    if(tree[2 * node].pref == (mij - left + 1))
        tree[node].pref = (mij - left + 1) + tree[2 * node + 1].pref;
    else
        tree[node].pref = tree[2 * node].pref;

    if(tree[2 * node + 1].suf == (right - mij))
        tree[node].suf = tree[2 * node].suf + right - mij;
    else
        tree[node].suf = tree[2 * node + 1].suf;

    tree[node].seg = max({tree[2 * node].seg, tree[2 * node + 1].seg, tree[2 * node].suf + tree[2 * node + 1].pref});
}

int32_t main()
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    int m;
    cin >> n >> m;
    build(1, 1, n);
    fill(lazy, lazy + 4 * Nmax + 4, 0);
    while(m--)
    {
        int c;
        cin >> c;
        if(c == 3)
        {
            cout << tree[1].seg << '\n';
        }
        if(c == 1)
        {
            int start, fin;
            cin >> start >> fin;
            fin += start - 1;

            update(1, 1, n, start, fin, 1);
        }
        if(c == 2)
        {
            int start , fin;
            cin >> start >> fin;
            fin += start - 1;

            update(1, 1, n, start, fin, -1);
        }
    }
    return 0;
}