Cod sursa(job #3199486)

Utilizator adrian_zahariaZaharia Adrian adrian_zaharia Data 1 februarie 2024 17:47:37
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <bits/stdc++.h>

#define FastIo() ios_base::sync_with_stdio(false), fin.tie(nullptr),fout.tie(nullptr);
#define ll int64_t
#define pii pair<int,int>
#define pipii pair<int,pair<int,int>>
using namespace std;

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

#define fin cin
#define fout cout

int n, m, x, y,op;
const int NMAX = 100001;
ll v[NMAX];

struct tree_node {
    ll max, l, r, lazy;
};
vector<tree_node> tree(4 * NMAX);

void update_node(int node, int l, int r){
    int m = (l + r)/2;
    int l_node = 2 * node;
    int r_node = 2 * node + 1;

    if(tree[l_node].l == m-l+1) tree[node].l = (m-l+1)+tree[r_node].l;
    else tree[node].l = tree[l_node].l;

    if(tree[r_node].r == r-m) tree[node].r = r-m + tree[l_node].r;
    else tree[node].r = tree[r_node].r;

    tree[node].max = max(tree[l_node].r + tree[r_node].l,max(tree[l_node].max,tree[r_node].max));
}
void update_lazy(int node, int l, int r){
    if(tree[node].lazy == 1){
        tree[node]={0,0,0,0};
        if(l!=r)
            tree[2*node].lazy = tree[2*node+1].lazy = 1;
    }else if(tree[node].lazy==2){
        tree[node] = {r-l+1,r-l+1,r-l+1,0};
        if(l!=r)
            tree[2*node].lazy = tree[2*node+1].lazy = 2;
    }
}

void update(int node, int l, int r,int update_l, int update_r, int value){

    if(update_l<=l && r<=update_r){
        tree[node].lazy = value;
    }else{
        int m = (l + r)/2;
        update_lazy(node, l,r);
        if(update_l<=m)
            update(2*node, l,m,update_l,update_r,value);
        if(m < update_r)
            update(2*node+1,m+1,r,update_l,update_r,value);

        update_lazy(2*node, l,m);
        update_lazy(2*node+1,m+1,r);

        update_node(node, l,r);
    }
}


int main() {

    fin >> n >> m;

    tree[1].lazy = 2;
    for(int i=1;i<=m;i++){
        fin>>op;
        if(op==1){
            fin>>x>>y;
            update(1,1,n,x,x+y-1,1);
        }else if(op==2){
            fin>>x>>y;
            update(1,1,n,x,x+y-1,2);
        }else{
            update_lazy(1,1,n);
            fout<<tree[1].max<<'\n';
        }
    }
    return 0;
}