Cod sursa(job #2963698)

Utilizator Luka77Anastase Luca George Luka77 Data 11 ianuarie 2023 21:30:40
Problema Hotel Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.34 kb
#include <bits/stdc++.h>
using namespace std;

/// MORBESC
///                         __
///                   _.--""  |
///    .----.     _.-'   |/\| |.--.
///    |    |__.-'   _________|  |_)  _______________
///    |  .-""-.""""" ___,    `----'"))   __   .-""-.""""--._
///    '-' ,--. `    |Luka77| .---.       |:.| ' ,--. `      _`.
///     ( (    ) ) __|  7  |__\\|// _..-- \/ ( (    ) )--._".-.
///      . `--' ;\__________________..--------. `--' ;--------'
///       `-..-'                               `-..-'

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

/// STRUCTURES
struct tree_node
{
    short lazy;
    int st, dr, maxx, l;
};

/// GLOBAL VARIABLES
const int NMAX = 1e5+5;
int n, q;
tree_node tree[NMAX];

inline void update_node(int node)
{
    if(tree[node*2].maxx == tree[node*2].l)
        tree[node].st = tree[node*2].l + tree[node*2+1].st;
    else
        tree[node].st = tree[node*2].st;
    if(tree[node*2+1].maxx == tree[node*2+1].l)
        tree[node].dr = tree[node*2+1].l + tree[node*2].dr;
    else
        tree[node].dr = tree[node*2+1].dr;
    tree[node].maxx = max({tree[node*2].maxx, tree[node*2+1].maxx, tree[node*2].dr + tree[node*2+1].st});
}

inline void build(int node, int st, int dr)
{
    if(!tree[node].l)
        tree[node].l = dr - st + 1;
    if(st == dr)
    {
        tree[node].st = 1;
        tree[node].dr = 1;
        tree[node].maxx = 1;
    }
    else
    {
        int mid = (st + dr) / 2;
        build(node*2, st, mid);
        build(node*2+1, mid + 1, dr);
        update_node(node);
    }
}

inline void lazy_update(int node, int st, int dr)
{
    if(tree[node].lazy == 1)
    {
        tree[node].st = 0;
        tree[node].dr = 0;
        tree[node].maxx = 0;
        if(st != dr)
        {
            tree[node*2].lazy = tree[node].lazy;
            tree[node*2+1].lazy = tree[node].lazy;
        }
    }
    if(tree[node].lazy == 2)
    {
        tree[node].st = dr- st + 1;
        tree[node].dr = dr - st + 1;
        tree[node].maxx = dr - st  + 1;
        if(st != dr)
        {
            tree[node*2].lazy = tree[node].lazy;
            tree[node*2+1].lazy = tree[node].lazy;
        }
    }
    tree[node].lazy = 0;
}

inline void update(int node, int st, int dr, int arbst, int arbdr, int type)
{
    if(tree[node].lazy)
        lazy_update(node, st, dr);
    if(dr < arbst || st > arbdr)
        return;
    if(st >= arbst && dr <= arbdr)
    {
        tree[node].lazy = type;
        lazy_update(node, st, dr);
        return;
    }
    int mid = (st + dr) / 2;
    update(node*2, st, mid, arbst, arbdr, type);
    update(node*2+1, mid + 1, dr, arbst, arbdr, type);
    update_node(node);
}

/// READING THE INPUT
int main()
{
    ios::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    fin >> n >> q;

    build(1, 1, n);

    while(q--)
    {
        int type;
        fin >> type;
        if(type == 1)
        {
            int a, b;
            fin >> a >> b;
            update(1, 1, n, a, a + b - 1, type);
        }
        if(type == 2)
        {
            int a, b;
            fin >> a >> b;
            update(1, 1, n, a, a + b - 1, type);
        }
        if(type == 3)
        {
            fout << tree[1].maxx << '\n';
        }
    }
}