Cod sursa(job #874436)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 8 februarie 2013 14:12:12
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

int n, m, cod, A, B, poz;
struct arbore
{
    int st, dr, maxim;
};
arbore aint[262145];

inline void Update(int nod, int st, int dr)
{
    if (A <= st && dr <= B)
    {
        if (cod == 1) // sosire
            aint[nod].maxim = aint[nod].st = aint[nod].dr = 0; //  nu mai am nicio camera libera in itervalul [st, dr];
        else // plecare
            aint[nod].maxim = aint[nod].st = aint[nod].dr = dr - st + 1; // se elibereaza toate camerele pentru intervalul [st, dr]
        return ;
    }
    int mij = (st+dr)>>1, fiu = nod<<1;

    if (aint[nod].maxim == dr - st + 1)// daca le am pe toate libere, inseamna ca am si fii liberi
    {
        aint[fiu].maxim = aint[fiu].st = aint[fiu].dr = mij - st + 1;
        aint[fiu+1].maxim = aint[fiu+1].st = aint[fiu+1].dr = dr - mij;
    }
    if (aint[nod].maxim == 0) // daca le am pe toate ocupate, inseamna ca am si toti fii ocupati
    {
        aint[fiu].maxim = aint[fiu+1].maxim = 0;
        aint[fiu].st = aint[fiu+1].st = 0;
        aint[fiu].dr = aint[fiu+1].dr = 0;
    }
    if (A <= mij)
        Update (fiu, st, mij);
    if (mij < B)
        Update (fiu+1, mij+1, dr);

    aint[nod].st = aint[fiu].st;
    if (aint[fiu].st >= mij - st + 1) // daca am tot fiul stang liber atunci pot continua cu fiul drept
        aint[nod].st += aint[fiu+1].st;

    aint[nod].dr = aint[fiu+1].dr;
    if (aint[fiu+1].dr >= dr - mij) // daca am tot fiul drept liber pot continua cu fiul stang
        aint[nod].dr += aint[fiu].dr;

    aint[nod].maxim = max(max(aint[fiu].maxim, aint[fiu+1].maxim), max(max (aint[nod].st, aint[nod].dr),aint[fiu].dr + aint[fiu+1].st));
    return ;
}

inline void Build(int nod, int st, int dr)
{
    if (st == dr)
    {
        aint[nod].st = aint[nod].maxim = aint[nod].dr = 1;
        return;
    }
    int mij = (st+dr)>>1, fiu = nod<<1;
    Build(fiu, st, mij);
    Build(fiu+1, mij+1, dr);
    aint[nod].st = aint[nod].dr = aint[nod].maxim = aint[fiu].maxim + aint[fiu+1].maxim;
}

inline void Scrie()
{
    ofstream g("test.txt");
    int i;
    for(i=1; i<=32; i++)
        g<<aint[i].st<<" "<<aint[i].maxim<<" "<<aint[i].dr<<"\n";
    g.close();
}

inline void Solve()
{
    ifstream f ("hotel.in");
    ofstream g ("hotel.out");
    f>>n>>m;
    cod = 2;
    A = 1;
    B = n;
    //Update(1, 1, n);

    Build (1, 1, n);
    //Scrie();
    while (m)
    {
        m--;
        f>>cod;
        if (cod == 3)
        {
            g<<aint[1].maxim<<"\n";
        }
        else
        {
            f>>A>>B;
            B = A+B-1;
            Update(1, 1, n);
        }
    }
    f.close();
    g.close();
}

int main()
{
    Solve();
    return 0;
}