Cod sursa(job #3290956)

Utilizator bogdan1479Luca Bogdan Alexandru bogdan1479 Data 2 aprilie 2025 15:15:04
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>

using namespace std;

const int NMAX = 1e5 + 1;

struct nod
{
    int sum, sst, sdr;
    bool upd;
    nod(int val = 0, bool update = 1)
    {
        sum = sst = sdr = val;
        upd = update;
    }
} aib[4 * NMAX];

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

int n, m, nrn[4 * NMAX];

void build(int rad, int st, int dr)
{
    if(st == dr)
    {
        nrn[rad] = 1;
        aib[rad] = nod(1, 0);
        return;
    }
    int mij = (st + dr) / 2;
    build(2 * rad, st, mij);
    build(2 * rad + 1, mij + 1, dr);
    nrn[rad] = dr - st + 1;
    aib[rad] = nod(nrn[rad], 0);
}

void updateNod(int rad)
{
    if(!aib[rad].upd) return;
    if(aib[rad].sum)
    {
        aib[2 * rad] = nod(nrn[2 * rad]);
        aib[2 * rad + 1] = nod(nrn[2 * rad + 1]);
    }
    else
    {
        aib[2 * rad] = nod();
        aib[2 * rad + 1] = nod();
    }
    aib[rad].upd = 0;
}

void update(int rad, int st, int dr, int a, int b, bool val)
{
    if(a <= st && b >= dr)
    {
        if(val) aib[rad] = nod(nrn[rad]);
        else aib[rad] = nod();
        return;
    }
    updateNod(rad);
    int mij = (st + dr) / 2;
    if(a <= mij) update(2 * rad, st, mij, a, b, val);
    if(b > mij) update(2 * rad + 1, mij + 1, dr, a, b, val);
    aib[rad].sum = max(aib[2 * rad].sum, aib[2 * rad + 1].sum);
    aib[rad].sum = max(aib[rad].sum, aib[2 * rad].sdr + aib[2 * rad + 1].sst);
    aib[rad].sst = aib[2 * rad].sst;
    if(aib[2 * rad].sum && aib[2 * rad].sum == aib[2 * rad].sst) aib[rad].sst += aib[2 * rad + 1].sst;
    aib[rad].sdr = aib[2 * rad + 1].sdr;
    if(aib[2 * rad + 1].sum && aib[2 * rad + 1].sum == aib[2 * rad + 1].sdr) aib[rad].sdr += aib[2 * rad].sdr;
}

int main()
{
    int op, a, b;
    fin >> n >> m;
    build(1, 1, n);
    while(m--)
    {
        fin >> op;
        if(op == 1)
        {
            fin >> a >> b;
            update(1, 1, n, a, a + b - 1, 0);
        }
        else if(op == 2)
        {
            fin >> a >> b;
            update(1, 1, n, a, a + b - 1, 1);
        }
        else fout << aib[1].sum << '\n';
    }
    return 0;
}