Cod sursa(job #3338233)

Utilizator Belea_DariusBelea Mihai Darius Belea_Darius Data 1 februarie 2026 19:07:42
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <bits/stdc++.h>
#define MAXN 400000

using namespace std;

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

struct cam{
    int pref, suff, best;
} aint[4 * MAXN];

cam combine(cam A, cam B, int lenA, int lenB){
    cam C;

    C.pref = A.pref;
    if(A.pref == lenA){
        C.pref += B.pref;
    }

    C.suff = B.suff;
    if(B.suff == lenB){
        C.suff += A.suff;
    }

    C.best = max(max(A.best, B.best), A.suff + B.pref);
    return C;
}
void build(int nod, int st, int dr){
    int mij;
    if(st == dr){
        aint[nod].best = aint[nod].pref = aint[nod].suff = 1;
    }else{
        mij = (st + dr) / 2;
        build(2 * nod, st, mij);
        build(2 * nod + 1, mij + 1, dr);
        aint[nod] = combine(aint[2 * nod], aint[2 * nod + 1], mij - st + 1, dr - mij);
    }
}
void update(int nod, int st, int dr, int l, int r, int val){
    int mij, len;
    if(!(st > r || dr < l)){
        if(st == dr){
            len = dr - st + 1;
            aint[nod].pref = aint[nod].suff = aint[nod].best = val * len;
        }else{
            mij = (st + dr) / 2;
            update(2 * nod, st, mij, l, r, val);
            update(2 * nod + 1, mij + 1, dr, l, r, val);
            aint[nod] = combine(aint[2 * nod], aint[2 * nod + 1], mij - st + 1, dr - mij);
        }
    }
}

int main()
{
    int n, p, tip, i, m;

    fin >> n >> p;
    build(1, 1, n);

    while(p --){
        fin >> tip;

        if(tip == 3){
            fout << aint[1].best << "\n";
        }else if(tip == 1){
            fin >> i >> m;
            update(1, 1, n, i, i + m - 1, 0);
        }else{
            fin >> i >> m;
            update(1, 1, n, i, i + m - 1, 1);
        }
    }
    return 0;
}