Cod sursa(job #3239412)

Utilizator Cyb3rBoltSbora Ioan-David Cyb3rBolt Data 5 august 2024 14:45:14
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n, q;

struct Iris {
    ///pentru un interval [st, dr] tinem minte nr de camere libere din interval,
    ///nr de camerele libere ce incep din stanga si nr de camere libere ce se termina in dreapta
    int maximLiber, stanga, dreapta;
}aint[400010];

inline void build(int nod, int st, int dr) {
    if(st == dr) aint[nod].maximLiber = aint[nod].stanga = aint[nod].dreapta = 1;
    else {
        int mid = (st + dr) / 2;
        build(2 * nod, st, mid);
        build(2 * nod + 1, mid + 1, dr);
        aint[nod].stanga = aint[2 * nod].stanga;
        if(aint[nod].stanga == mid - st + 1) aint[nod].stanga += aint[2 * nod + 1].stanga;
        aint[nod].dreapta = aint[2 * nod + 1].dreapta;
        if(aint[nod].dreapta == dr - mid) aint[nod].dreapta += aint[2 * nod].dreapta;
        aint[nod].maximLiber = max({aint[2 * nod].maximLiber, aint[2 * nod + 1].maximLiber, aint[2 * nod].dreapta + aint[2 * nod + 1].stanga});
    }
}

inline void update(int nod, int st, int dr, int a, int b, int val) {
    if(a <= st && dr <= b) {
        if(val == -1) aint[nod].maximLiber = aint[nod].stanga = aint[nod].dreapta = 0;
        else aint[nod].maximLiber = aint[nod].stanga = aint[nod].dreapta = dr - st + 1;
    }
    else {
        int mid = (st + dr) / 2;
        if(aint[nod].maximLiber == dr - st + 1) {
            aint[2 * nod].stanga = aint[2 * nod].dreapta = aint[2 * nod].maximLiber = mid - st + 1;
            aint[2 * nod + 1].stanga = aint[2 * nod + 1].dreapta = aint[2 * nod + 1].maximLiber = dr - mid;
        }
        else if(aint[nod].maximLiber == 0) {
            aint[2 * nod].stanga = aint[2 * nod].dreapta = aint[2 * nod].maximLiber = 0;
            aint[2 * nod + 1].stanga = aint[2 * nod + 1].dreapta = aint[2 * nod + 1].maximLiber = 0;
        }
        if(a <= mid) update(2 * nod, st, mid, a, b, val);
        if(b >= mid + 1) update(2 * nod + 1, mid + 1, dr, a, b, val);
        aint[nod].stanga = aint[2 * nod].stanga;
        if(aint[nod].stanga == mid - st + 1) aint[nod].stanga += aint[2 * nod + 1].stanga;
        aint[nod].dreapta = aint[2 * nod + 1].dreapta;
        if(aint[nod].dreapta == dr - mid) aint[nod].dreapta += aint[2 * nod].dreapta;
        aint[nod].maximLiber = max({aint[2 * nod].maximLiber, aint[2 * nod + 1].maximLiber, aint[2 * nod].dreapta + aint[2 * nod + 1].stanga});
    }
}

int main()
{
    fin >> n >> q;
    build(1, 1, n);
    while(q--) {
        int tip; fin >> tip;
        if(tip == 1) {
            int index, nr; fin >> index >> nr;
            update(1, 1, n, index, index + nr - 1, -1);
        }
        else if(tip == 2) {
            int index, nr; fin >> index >> nr;
            update(1, 1, n, index, index + nr - 1, 1);
        }
        else fout << aint[1].maximLiber << '\n';
        //for(int i=1; i<=4*n; i++) fout << i << " " << aint[i].maximLiber << " " << aint[i].stanga << " " << aint[i].dreapta << '\n';
    }

    return 0;
}