Cod sursa(job #2800762)

Utilizator dariaesteraDaria Estera Emanuela dariaestera Data 13 noiembrie 2021 21:52:59
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <bits/stdc++.h>

using namespace std;

const int N=10000000;

ifstream f("hotel.in");
ofstream g("hotel.out");

int n, p, i, m, c, poz;

struct nod
{
    int mx, st, dr;
} a[N];


inline int maxim(int a, int b)
{
    if(a > b)
        return a;
    return b;
}

void adauga(int poz, int l, int r, int p, int q)
{
    int k = r - l + 1, mid = (r + l) / 2;
    if(p <= l && r <= q)
    {
        a[poz].st = 0;
        a[poz].dr = 0;
        a[poz].mx = 0;
        return;
    }
    if(a[poz].st == k && a[poz].dr == k)
    {
        a[2*poz].st = a[2*poz].mx = a[2*poz].dr = mid - l + 1;
        a[2*poz+1].st = a[2*poz+1].mx = a[2*poz+1].dr = r - mid;
    }
    if(p <= mid)
        adauga(2 * poz, l, mid, p, q);
    if(mid < q)
        adauga(2 * poz + 1, mid + 1, r, p, q);
    if(a[2*poz].st == mid - l + 1)
        a[poz].st = a[2*poz].st + a[2*poz+1].st;
    else
        a[poz].st = a[2*poz].st;
    if(a[2*poz+1].dr == r - mid)
        a[poz].dr = a[2*poz+1].dr + a[2*poz].dr;
    else
        a[poz].dr = a[2*poz+1].dr;
    a[poz].mx = maxim(maxim(a[2*poz].mx, a[2*poz+1].mx), a[2*poz].dr + a[2*poz+1].st);
}


void elibereaza(int poz,int l, int r, int p,int q)
{
    int k = r - l + 1, mid = (r + l) / 2;
    if(p <= l && r <= q)
    {
        a[poz].st = k;
        a[poz].dr = k;
        a[poz].mx = k;
        return;
    }
    if(a[poz].mx == 0)
    {
        a[2*poz].st = a[2*poz].mx = a[2*poz].dr = 0;
        a[2*poz+1].st = a[2*poz+1].mx = a[2*poz+1].dr = 0;
    }
    if(p <= mid)
        elibereaza (2 * poz, l, mid, p, q);
    if(mid < q)
        elibereaza (2 * poz+1, mid+1, r, p, q);
    if(a[2*poz].st == mid - l + 1)
        a[poz].st = a[2*poz].st + a[2*poz+1].st;
    else
        a[poz].st = a[2*poz].st;
    if(a[2*poz+1].dr == r - mid)
        a[poz].dr = a[2*poz+1].dr + a[2*poz].dr;
    else
        a[poz].dr = a[2*poz+1].dr;
    a[poz].mx = maxim (maxim (a[2 * poz].mx, a[2 * poz + 1].mx), a[2 * poz].dr + a[2 * poz + 1].st);
}


int main()
{
    f >> n >> p;
    a[1].dr = a[1].st = a[1].mx = n;
    for(i=1; i<=p; ++i)
    {
        f>>c;
        if(c == 1)
        {
            f >> poz >> m;
            adauga (1, 1, n, poz, poz + m - 1);
        }
        if(c == 2)
        {
            f >> poz >> m;
            elibereaza (1, 1, n, poz, poz + m - 1);
        }
        if(c == 3)
            g << a[1].mx << "\n";
    }
    return 0;
}