Cod sursa(job #3288837)

Utilizator ItsHezovPahonie George Alessio ItsHezov Data 24 martie 2025 14:24:18
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.27 kb
#include <iostream>

using namespace std;
const int mxN = 1e5;
struct info{int libere = 0, prefix = 0, suffix = 0,flag = 0;}A[4*mxN+1];
void build(int node, int st, int dr)
{
    if(st == dr)
    {
        A[node].libere = 1;
        A[node].prefix = 1;
        A[node].suffix = 1;
        A[node].flag = 0;
        return;
    }
    int mid = (st + dr) / 2;
    build(2*node,st,mid);
    build(2*node+1,mid+1,dr);
    A[node].libere = A[2*node].libere + A[2*node+1].libere;
    A[node].prefix = A[2*node].prefix;
    if(A[node].prefix == mid - st + 1)
        A[node].prefix+=A[2*node+1].prefix;
    A[node].suffix = A[2*node+1].suffix;
    if(A[node].suffix == dr - mid)
        A[node].suffix+=A[2*node].suffix;
    A[node].flag = 0;
}
void update(int node, int st, int dr, int a, int b, int val)
{
    if(a<=st && dr <= b)
    {
        if(val == 1)
        {
            A[node].libere = 0;
            A[node].prefix = 0;
            A[node].suffix = 0;
            A[node].flag = 1; // se ocupa intreaga portiune
        }
        if(val == 0)
        {
            A[node].libere = dr - st + 1;
            A[node].prefix = dr - st + 1;
            A[node].suffix = dr - st + 1;
            A[node].flag = 2; // se elibereaza intreaga portiune.
        }
        return;
    }
    int mid = (st + dr) / 2;
    if(A[node].flag == 1)
    {
        A[2*node].flag = 1;
        A[2*node+1].flag = 1;
        A[2*node].flag = 0;

        A[2*node].libere = 0;
        A[2*node+1].libere = 0;

        A[2*node].suffix = A[2*node+1].suffix = 0;
        A[2*node].prefix = A[2*node+1].prefix = 0;
    }
    if(A[node].flag == 2)
    {
        A[2*node].flag = 2;
        A[2*node+1].flag = 2;
        A[2*node].flag = 0;

        A[2*node].libere = mid - st + 1;
        A[2*node+1].libere = dr - mid;

        A[2*node].suffix = mid - st + 1;
        A[2*node+1].suffix = dr - mid;

        A[2*node].prefix = mid - st + 1;
        A[2*node+1].prefix = dr - mid;
    }
    if(a<=mid)
        update(2*node, st, mid, a, b, val);
    if(b > mid)
        update(2*node+1,mid+1,dr,a,b,val);

    /// Now the fun part, to combine the two.
    // Find the prefix for A[node]
    A[node].prefix = A[2*node].prefix;
    if(A[2*node].prefix == mid - st + 1)
        A[node].prefix+=A[2*node+1].prefix;
    // Find the suffix for A[node]
    A[node].suffix = A[2*node+1].suffix;
    if(A[2*node+1].suffix == dr - mid)
        A[node].suffix+=A[2*node+1].suffix;
    // Now find the required thing lol
    A[node].libere = max(A[2*node].libere, A[2*node+1].libere);
    A[node].libere = max(A[2*node].libere, A[2*node].suffix + A[2*node+1].prefix);
    return;
}
int main()
{
    int n , m ;
    cin >> n >> m;
    build(1,1,n);
    for(int i = 1;i<=m;i++)
    {
        int op;
        cin >> op;
        if(op == 1) /// marcam ca fiind ocupate
        {
            int poz, marime;
            cin >> poz >> marime;
            update(1,1,n,poz,poz + marime - 1, 1);
        }
        if(op == 2)
        {
            int poz,marime;
            cin >> poz >> marime;
            update(1,1,n,poz,poz+marime-1,0);
        }
        if(op == 3)
        {
            cout << A[1].libere << '\n';
        }
    }
    return 0;
}