Cod sursa(job #3363483)

Utilizator Alexutu008Ionita Alexandru-Dumitru Alexutu008 Data 18 august 2026 16:06:08
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;
const int max_size = 1e5 + 1, max_seg = 4e5 + 1;

int n, q, op, i, gsize, v[max_size], aint[max_seg], lazy[max_seg];
// v[i] = is_free[i]

void init(int l, int r, int nod)
{
    if (l == r)
    {
        aint[nod] = v[l];
        return;
    }
    int m = (l + r) / 2;
    init(l, m, nod * 2);
    init(m + 1, r, nod * 2 + 1);
    aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}

void push(int l, int r, int nod)
{
    if (l != r)
    {
        aint[nod << 1] += lazy[nod];
        aint[(nod << 1) + 1] += lazy[nod];
        lazy[nod << 1] += lazy[nod];
        lazy[(nod << 1) + 1] += lazy[nod];
    }
    lazy[nod] = 0;
}

void update(int l, int r, int st, int dr, int val, int nod)
{
    if (st <= l && r <= dr)
    {
        lazy[nod] += val;
        aint[nod] += val * (r - l + 1);
        return;
    }
    push(l, r, nod);
    int m = l + r >> 1;
    if (st <= m)
        update(l, m, st, dr, val, nod << 1);
    if (m + 1 <= dr)
        update(m + 1, r, st, dr, val, (nod << 1) + 1);
    aint[nod] = aint[nod << 1] + aint[(nod << 1) + 1];
}

int main()
{
    freopen("hotel.in", "r", stdin);
    freopen("hotel.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> q;
    for (int i = 1; i <= n; ++i)
        v[i] = 1;
    init(1, n, 1);

    while (q--)
    {
        cin >> op;
        if (op == 3)
        {
            cout << aint[1] << '\n';
        }
        else
        {
            cin >> i >> gsize;
            if (op == 2)
                update(1, n, i, i + gsize - 1, 1, 1);
            else
                update(1, n, i, i + gsize - 1, -1, 1);
        }
        // cout<<aint[1]<<'\n';
    }

    return 0;
}