Cod sursa(job #3362876)

Utilizator alex.iovita.23@gmail.comIovita Alexandru [email protected] Data 12 august 2026 21:22:40
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include<bits/stdc++.h>
#define int long long
#define DIM 100000

using namespace std;

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

int n , m , inainte = 1;
struct Iris{
    int sum , sufix , prefix , smax;
}aint[4 * DIM + 5];
int lazy[4 * DIM + 5];

inline Iris combine(Iris st , Iris dr){
    Iris rez;
    rez.sum = st.sum + dr.sum;
    rez.sufix = max(dr.sufix , dr.sum + st.sufix);
    rez.prefix = max(st.prefix , st.sum + dr.prefix);
    rez.smax = max({st.smax , dr.smax , st.sufix + dr.prefix});
    return rez;
}

inline void build(int nod , int st , int dr){
    if(st == dr){
        aint[nod] = {1 , 1 , 1 , 1};
        lazy[nod] = 0;
    }
    else{
        int mid = (st + dr) / 2;
        build(2 * nod , st , mid);
        build(2 * nod + 1 , mid + 1 , dr);
        aint[nod] = combine(aint[2 * nod] , aint[2 * nod + 1]);
        lazy[nod] = 0;
    }
}

inline void stare(int nod , int st , int dr , int tip){
    int lun = dr - st + 1;
    if(tip == 1) aint[nod] = {lun , lun , lun , lun};
    else if(tip == 2) aint[nod] = {-1000000000 * lun , 0 , 0 , 0};
    lazy[nod] = tip;
}

inline void push(int nod , int st , int dr){
    if(lazy[nod] != 0 && st != dr){
        int mid = (st + dr) / 2;
        stare(2 * nod , st , mid , lazy[nod]);
        stare(2 * nod + 1 , mid + 1 , dr , lazy[nod]);
        lazy[nod] = 0;
    }
}

inline void update(int nod , int st , int dr , int a , int b , int tip){
    if(a <= st && dr <= b){
        stare(nod , st , dr , tip);
    }
    else if(a > dr && st > b) return ;
    else{
        push(nod , st , dr);
        int mid = (st + dr) / 2;
        if(a <= mid) update(2 * nod , st , mid , a , b , tip);
        if(b > mid) update(2 * nod + 1 , mid + 1 , dr , a , b , tip);
        aint[nod] = combine(aint[2 * nod] , aint[2 * nod + 1]);
    }
}

signed main(){
    fin >> n >> m;
    build(1 , 1 , n);
    for(int i = 1; i <= m ; i++){
        int tip; fin >> tip;
        if(tip == 1){
            int x , y; fin >> x >> y;
            update(1 , 1 , n , x , x + y - 1 , 2);
        }
        else if(tip == 2){
            int x , y; fin >> x >> y;
            update(1 , 1 , n , x , x + y - 1 , 1);
        }
        else fout << aint[1].smax << '\n';
    }
}