Cod sursa(job #3288854)

Utilizator Mihai_999Diaconeasa Mihai Mihai_999 Data 24 martie 2025 16:06:41
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <iostream>
#include <fstream>
#define nl '\n'

using namespace std;

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

const int NMAX = 1e5+5;

int n;

struct node
{
    int maxSecv;
    int maxPref;
    int maxSuf;
    int ocupate;
    int lazy;
    int sz;
};
node aint[4*NMAX];

void build(int node, int low, int high)
{
    if (low == high)
    {
        aint[node] = {1, 1, 1, 0, -1, 1};
        return;
    }
    int mid = (low+high)>>1;
    build(2*node, low, mid);
    build(2*node+1, mid+1, high);
    aint[node] = {high-low+1, high-low+1, high-low+1, 0, -1, high-low+1};
    return;
}

void propagate(int node)
{
    if (aint[node].lazy != -1)
    {
        if (aint[node].lazy == 0)
        {
            aint[2*node] = {aint[2*node].sz, aint[2*node].sz, aint[2*node].sz, 0, 0, aint[2*node].sz};
            aint[2*node+1] = {aint[2*node+1].sz, aint[2*node+1].sz, aint[2*node+1].sz, 0, 0, aint[2*node+1].sz};
        }
        else
        {
            aint[2*node] = {0, 0, 0, aint[2*node].sz, 1, aint[2*node].sz};
            aint[2*node+1] = {0, 0, 0, aint[2*node+1].sz, 1, aint[2*node+1].sz};
        }
        aint[node].lazy = -1;
    }
    return;
}


void update(int node, int low, int high, int a, int b, int val)
{
    if (a <= low && high <= b)
    {
        if (val == 0) /// 0 pleaca
            aint[node] = {aint[node].sz, aint[node].sz, aint[node].sz, 0, 0, aint[node].sz};
        else
            aint[node] = {0, 0, 0, aint[node].sz, 1, aint[node].sz};
        return;
    }
    int mid = (low+high)>>1;
    propagate(node);
    if (a <= mid)
        update(2*node, low, mid, a, b, val);
    if (mid+1 <= b)
        update(2*node+1, mid+1, high, a, b, val);
    aint[node].ocupate = aint[2*node].ocupate+aint[2*node+1].ocupate;
    aint[node].maxSecv = max(aint[2*node].maxSecv, aint[2*node+1].maxSecv);
    aint[node].maxSecv = max(aint[node].maxSecv, aint[2*node].maxSuf+aint[2*node+1].maxPref);
    aint[node].maxPref = aint[2*node].maxPref;
    if (aint[2*node].ocupate == 0)
        aint[node].maxPref += aint[2*node+1].maxPref;
    aint[node].maxSuf = aint[2*node+1].maxSuf;
    if (aint[2*node+1].ocupate == 0)
        aint[node].maxSuf += aint[2*node].maxSuf;
    return;
}

int main()
{
    int t;
    fin >> n >> t;
    build(1, 1, n);
    while (t--)
    {
        int c, x, y;
        fin >> c;
        if (c == 3)
            fout << aint[1].maxSecv << nl;
        if (c == 2)
        {
            fin >> x >> y;
            y = x+y-1;
            update(1, 1, n, x, y, 0);
        }
        if (c == 1)
        {
            fin >> x >> y;
            y = x+y-1;
            update(1, 1, n, x, y, 1);
        }
    }
    return 0;
}