Cod sursa(job #3349708)

Utilizator David_RadavoiRadavoi David Alexandru David_Radavoi Data 1 aprilie 2026 21:10:37
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define NMAX 100000

struct Node{
    int pref, suf, lmax, l;
}tree[4 * NMAX + 1];
int lazy[4 * NMAX + 1];

Node join(Node a, Node b){
    Node aux;
    aux.l = a.l + b.l;
    aux.lmax = max(max(a.lmax, b.lmax), a.suf + b.pref);
    aux.pref = (a.pref == a.l)? a.l + b.pref : a.pref;
    aux.suf = (b.suf == b.l)? b.l + a.suf : b.suf;
    return aux;
}

void build(int node, int st, int dr){
    tree[node].l = dr - st + 1;
    if (st == dr){
        tree[node].suf = tree[node].pref = tree[node].lmax = 1;
        return;
    }
    int mij = (st + dr) / 2;
    build(node * 2, st, mij);
    build(node * 2 + 1, mij + 1, dr);
    tree[node] = join(tree[node * 2], tree[node * 2 + 1]);
}

void propagate(int node) {
    if (lazy[node] == 0) return;
    if (lazy[node] == 1){
        tree[node * 2].pref = tree[node * 2].suf = tree[node * 2].lmax = 0;
        tree[node * 2 + 1].pref = tree[node * 2 + 1].suf = tree[node * 2 + 1].lmax = 0;
    }
    else if (lazy[node] == 2){
        tree[node * 2].pref = tree[node * 2].suf = tree[node * 2].lmax = tree[node * 2].l;
        tree[node * 2 + 1].pref = tree[node * 2 + 1].suf = tree[node * 2 + 1].lmax = tree[node * 2 + 1].l;
    }
    lazy[node * 2] = lazy[node * 2 + 1] = lazy[node];
    lazy[node] = 0;
}

void update(int node, int st, int dr, int ql, int qr, int val){
    if (dr < ql || qr < st){
        return;
    }
    if (ql <= st && dr <= qr){
        if (val == 1){
            tree[node].pref = tree[node].suf = tree[node].lmax = 0;
        }
        else{
            tree[node].pref = tree[node].suf = tree[node].lmax = tree[node].l;
        }
        lazy[node] = val;
        return;
    }
    propagate(node);
    int mij = (st + dr) / 2;
    update(node * 2, st, mij, ql, qr, val);
    update(node * 2 + 1, mij + 1, dr, ql, qr, val);
    tree[node] = join(tree[node * 2], tree[node * 2 + 1]);
}

int main()
{
    int N, M;
    fin >> N >> M;
    build(1, 1, N);
    for (int i = 1; i <= M; i++){
        int tip;
        fin >> tip;
        if (tip == 1){
            int poz, cati;
            fin >> poz >> cati;
            update(1, 1, N, poz, poz + cati - 1, 1);
        }
        else if (tip == 2){
            int poz, cati;
            fin >> poz >> cati;
            update(1, 1, N, poz, poz + cati - 1, 2);
        }
        else{
            fout << tree[1].lmax << '\n';
        }
    }
    return 0;
}