Cod sursa(job #3160006)

Utilizator divadddDavid Curca divaddd Data 22 octombrie 2023 18:08:41
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 1e9;
const int NMAX = 1e5+2;
int n,q,t,x,y;

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

struct Node{
    int lazy = 0, val = 0, len = 0;
    int sum = -INF, pref = -INF, suff = -INF, ssm = -INF;
    Node(){}
    Node(int x){
        sum = pref = suff = ssm = x;
    }
    Node operator + (const Node &aux) const {
        Node ans;
        ans.len = len+aux.len;
        ans.sum = sum+aux.sum;
        ans.pref = max(pref, sum+aux.pref);
        ans.suff = max(aux.suff, aux.sum+suff);
        ans.ssm = max({ssm, aux.ssm, suff+aux.pref, ans.pref, ans.suff});
        return ans;
    }
    void set(int val){
        int all = val*len;
        sum = all;
        pref = all;
        suff = all;
        ssm = all;
    }
} aint[4*NMAX];

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

void propag(int nod){
    if(aint[nod].lazy){
        aint[nod].lazy = 0;
        aint[2*nod].lazy = aint[2*nod+1].lazy = 1;
        aint[2*nod].val = aint[2*nod+1].val = aint[nod].val;

        aint[2*nod].set(aint[nod].val);
        aint[2*nod+1].set(aint[nod].val);
    }
}

void update(int nod, int st, int dr, int l, int r, int val){
    if(l <= st && dr <= r){
        aint[nod].lazy = 1;
        aint[nod].val = val;
        aint[nod].set(val);
    }else{
        propag(nod);
        int mid = (st+dr)/2;
        if(l <= mid){
            update(2*nod, st, mid, l, r, val);
        }
        if(r >= mid+1){
            update(2*nod+1, mid+1, dr, l, r, val);
        }
        aint[nod] = aint[2*nod] + aint[2*nod+1];
    }
}

signed main()
{
    fin >> n >> q;
    build(1, 1, n);
    while(q--){
        fin >> t;
        if(t == 3){
            fout << max(0ll, aint[1].ssm) << "\n";
        }else if(t == 2){
            fin >> x >> y;
            y = x+y-1;
            update(1, 1, n, x, y, 1);
        }else{
            fin >> x >> y;
            y = x+y-1;
            update(1, 1, n, x, y, -INF);
        }
    }
    return 0;
}