Cod sursa(job #950830)

Utilizator Paula-ElenaPaula-Elena Margarit Paula-Elena Data 18 mai 2013 12:13:30
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.97 kb
#include<fstream>
using namespace std;

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

const int MAXN = 300010;
int N, P, M, x, poz, a,  b;
bool need_update[MAXN];

struct interval
{
    int liber, ls, ld;
};
interval arb[MAXN];

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

void ocupa(int p, int st, int dr)
{
    arb[p].liber = arb[p].ls = arb[p].ld = 0;
}

void elibereaza(int p, int st, int dr)
{
    arb[p].liber = arb[p].ls = arb[p].ld = dr-st+1;
}

void actualizare(int p, int st, int dr)
{
    int fs = 2*p, fd = 2*p+1, mid = (st+dr)/2;
    if(arb[fs].liber == mid-st+1)
        arb[p].ls = arb[fs].liber + arb[fd].ls;
    else
        arb[p].ls = arb[fs].ls;
    if(arb[fd].liber == dr-mid)
        arb[p].ld = arb[fd].liber + arb[fs].ld;
    else
        arb[p].ld = arb[fd].ld;
}

void update2(int p, int st, int dr)
{
    // se elibereaza camerele
    if(a<=st && dr<=b)
    {
        arb[p].liber = dr - st + 1;
        arb[p].ls = arb[p].liber;
        arb[p].ld = arb[p].liber;
        return;
    }
    int mid = (st + dr)/2;
    if(arb[p].liber == 0)
    {
        ocupa(2*p, st, mid);
        ocupa(2*p+1, mid+1, dr);
    }
    if(a <= mid)
        update2(2*p, st, mid);
    if(mid+1 <= b)
        update2(2*p+1, mid+1, dr);
    actualizare(p, st, dr);
    int aux = maxim(arb[2*p].liber, arb[2*p+1].liber);
    arb[p].liber = maxim(aux, arb[2*p].ld+arb[2*p+1].ls);
}

void update1(int p, int st, int dr)
{
    // se ocupa camerele
    if(a<=st && dr<=b)
    {
        arb[p].liber = 0;
        arb[p].ls = 0;
        arb[p].ld = 0;
        return;
    }
    int mid = (st + dr)/2;
    if(arb[p].liber == (dr-st+1))
    {
        elibereaza(2*p, st, mid);
        elibereaza(2*p+1, mid+1, dr);
    }
    if(a <= mid)
        update1(2*p, st, mid);
    if(mid+1 <= b)
        update1(2*p+1, mid+1, dr);
    actualizare(p, st, dr);
    int aux = maxim(arb[2*p].liber, arb[2*p+1].liber);
    arb[p].liber = maxim(aux, arb[2*p].ld+arb[2*p+1].ls);
}

void afisare(int p, int st, int dr)
{
    fout<<p<<" ["<<st<<","<<dr<<"] liber = " << arb[p].liber << " stanga = " << arb[p].ls << " dreapta = " << arb[p].ld << "\n";
    if(st != dr)
    {
        int mid = (st + dr) / 2;
        afisare(2*p, st, mid);
        afisare(2*p+1, mid+1, dr);
    }
}

int main()
{
    int i, aux;
    fin >> N >> P;
    arb[1].liber = arb[1].ls = arb[1].ld = N;
    for(i=0; i<P; ++i)
    {
        fin >> x;
        if(x == 1)
        {
            fin >> poz >> M;
            a = poz;
            b = poz+M-1;
            update1(1, 1, N);
        }
        else if(x == 2)
        {
            fin >> poz >> M;
            a = poz;
            b = poz+M-1;
            update2(1, 1, N);
        }
        else
            fout << arb[1].liber << "\n";
        //afisare(1,1,N);
        //fout<<"\n";
    }

    fin.close();
    fout.close();

    return 0;
}