Cod sursa(job #3287431)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 17 martie 2025 23:33:54
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<bits/stdc++.h>
#define int long long

using namespace std;

struct coord
{
    int st, dr, max;
};

const int NMAX = 5e5 + 5, INF = 1e12 + 7;
int n, m, v[NMAX], lazy[4 * NMAX], dur[NMAX];
coord arbint[4 * NMAX];

void upd_lazy(int poz, int st, int dr)
{
    if(lazy[poz] == 1)
        arbint[poz] = {dr - st + 1, dr - st + 1, dr - st + 1};
    else
        arbint[poz] = {0, 0, 0};
    
    if(st != dr)
    {
        lazy[poz * 2] = lazy[poz];
        lazy[poz * 2 + 1 ] = lazy[poz];
    }
    
    lazy[poz] = -INF;
}

void update(int val, int st, int dr, int arbst, int arbdr, int arbpoz)
{
    dur[arbpoz] = arbdr - arbst + 1;
    if(lazy[arbpoz] != -INF)
        upd_lazy(arbpoz, arbst, arbdr);
    
    if(dr < arbst || st > arbdr || st > dr)
        return;
    
    if(arbst >= st && arbdr <= dr)
    {
        lazy[arbpoz] = val;
        upd_lazy(arbpoz, arbst, arbdr);
        return;
    }
    
    int mij = (arbst + arbdr) / 2;
    update(val, st, dr, mij + 1, arbdr, arbpoz * 2 + 1);
    update(val, st, dr, arbst, mij, arbpoz * 2);
    
    arbint[arbpoz].st = arbint[arbpoz * 2].st;
    if(arbint[arbpoz * 2].max == dur[arbpoz * 2])
        arbint[arbpoz].st = dur[arbpoz * 2] + arbint[arbpoz * 2 + 1].st;
    
    arbint[arbpoz].dr = arbint[arbpoz * 2 + 1].dr;
    if(arbint[arbpoz * 2 + 1].max == dur[arbpoz * 2 + 1])
        arbint[arbpoz].dr = dur[arbpoz * 2 + 1] + arbint[arbpoz * 2].dr;
    
    arbint[arbpoz].max = max(arbint[arbpoz * 2].max, max(arbint[arbpoz * 2 + 1].max, arbint[arbpoz * 2].dr + arbint[arbpoz * 2 + 1].st));
}

int32_t main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    freopen("hotel.in", "r", stdin);
    freopen("hotel.out", "w", stdout);
    
    cin >> n >> m;
    update(1, 1, n, 1, n, 1);
    int c, a, b;
    
    for(int i = 1; i <= m; i++)
    {
        cin >> c;
        if(c == 1)
        {
            cin >> a >> b;
            update(0, a, a + b - 1, 1, n, 1);
        }
        else if(c == 2)
        {
            cin >> a >> b;
            update(1, a, a + b - 1, 1, n, 1);
        }
        else if(c == 3)
        {
            cout << arbint[1].max << "\n";
        }
    }
    
}