Cod sursa(job #2454725)

Utilizator StanCatalinStanCatalin StanCatalin Data 9 septembrie 2019 19:38:22
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int dim = 100005;

struct aint
{
    int maxi,pref,suf;
};

int n,q;
aint arb[4*dim];
int a,b;

int liber = 0;

void ocupa(int nod,int st,int dr)
{
    if (liber)
    {
        arb[nod].maxi = arb[nod].pref = arb[nod].suf = dr-st+1;
    }
    if (a <= st && dr <= b)
    {
        arb[nod].maxi = arb[nod].pref = arb[nod].suf = 0;
        return ;
    }
    if (dr < a || st > b)
    {
        return ;
    }
    int mid = (st+dr)/2;
    if (arb[nod].maxi == dr-st+1 && liber == 0)
    {
        liber = 1;
        ocupa(2*nod,st,mid);
        ocupa(2*nod+1,mid+1,dr);
        liber = 0;
    }
    else
    {
        ocupa(2*nod,st,mid);
        ocupa(2*nod+1,mid+1,dr);
    }

    arb[nod].maxi = max(max(arb[2*nod].maxi , arb[2*nod+1].maxi) , arb[2*nod].suf + arb[2*nod+1].pref);
    if (arb[2*nod].pref == mid-st+1)
    {
        arb[nod].pref = arb[2*nod].pref + arb[2*nod+1].pref;
    }
    else arb[nod].pref = arb[2*nod].pref;

    if (arb[2*nod+1].suf == dr-mid)
    {
        arb[nod].suf = arb[2*nod+1].suf + arb[2*nod].suf;
    }
    else arb[nod].suf = arb[2*nod+1].suf;
}

int ocupat = 0;

void elibereaza(int nod,int st,int dr)
{
    if (ocupat)
    {
        arb[nod].maxi = arb[nod].pref = arb[nod].suf = 0;
    }
    if (a <= st && dr <= b)
    {
        arb[nod].maxi = arb[nod].pref = arb[nod].suf = dr-st+1;
        return ;
    }
    if (dr < a || st > b)
    {
        return ;
    }
    int mid = (st+dr)/2;
    if (arb[nod].maxi == 0 && ocupat == 0)
    {
        ocupat = 1;
        elibereaza(2*nod,st,mid);
        elibereaza(2*nod+1,mid+1,dr);
        ocupat = 0;
    }
    else
    {
        elibereaza(2*nod,st,mid);
        elibereaza(2*nod+1,mid+1,dr);
    }
    arb[nod].maxi = max(max(arb[2*nod].maxi , arb[2*nod+1].maxi) , arb[2*nod].suf + arb[2*nod+1].pref);
    if (arb[2*nod].pref == mid-st+1)
    {
        arb[nod].pref = arb[2*nod].pref + arb[2*nod+1].pref;
    }
    else arb[nod].pref = arb[2*nod].pref;

    if (arb[2*nod+1].suf == dr-mid)
    {
        arb[nod].suf = arb[2*nod+1].suf + arb[2*nod].suf;
    }
    else arb[nod].suf = arb[2*nod+1].suf;
}

int main()
{
    int op;
    in >> n >> q;
    arb[1].maxi = arb[1].pref = arb[1].suf = n;
    for (int i=1; i<=q; i++)
    {
        in >> op;
        if (op == 1)
        {
            liber = 0;
            in >> a >> b;
            b = a + b - 1;
            ocupa(1,1,n);
        }
        if (op == 2)
        {
            ocupat = 0;
            in >> a >> b;
            b = a + b - 1;
            elibereaza(1,1,n);
        }
        if (op == 3)
        {
            out << arb[1].maxi << "\n";
        }
    }
    return 0;
}