Cod sursa(job #1604913)

Utilizator T.C.11Tolan Cristian T.C.11 Data 18 februarie 2016 17:53:15
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <fstream>

using namespace std;

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

struct coce{
int Max;
int from_left;
int from_right;
} v[500000] ;

int n,m,i,j,nr,c;
pair<int,int> interval;

void prnt()
{
    for (int i=1;i<30;i++)
        fout<<"v["<<i<<"].Max = "<<v[i].Max<<" ... v["<<i<<"].from_left = "<<v[i].from_left<<" ... v["<<i<<"].from_right = "<<v[i].from_right<<'\n';
    fout<<"\n............................................\n";
}

int max_in_interval(int start, int stop)
{
    return stop - start + 1;
}

void update_next(int nod, int start, int stop)
{
    if (v[nod].Max == stop - start + 1)
    {
        int mij = (start + stop) / 2;

        v[nod*2].Max = mij - start + 1;
        v[nod*2].from_left = v[nod*2].Max;
        v[nod*2].from_right = v[nod*2].Max;

        v[nod*2+1].Max = stop - mij;
        v[nod*2+1].from_left = v[nod*2+1].Max;
        v[nod*2+1].from_right = v[nod*2+1].Max;
    }
    if (v[nod].Max == 0)
    {
        v[nod*2].Max = 0;
        v[nod*2].from_left = 0;
        v[nod*2].from_right = 0;

        v[nod*2+1].Max = 0;
        v[nod*2+1].from_left = 0;
        v[nod*2+1].from_right = 0;
    }
}

void update_arbore(int nod, int start, int stop, pair<int,int> itv)
{
    if (stop < itv.first || start > itv.second)
        return;
    if (itv.first <= start && stop <= itv.second)
    {
        if (v[nod].Max == 0)
        {
            v[nod].Max = stop - start + 1;
            v[nod].from_left = v[nod].Max;
            v[nod].from_right = v[nod].Max;
        }
        else
        {
            v[nod].Max = 0;
            v[nod].from_left = 0;
            v[nod].from_right = 0;
        }
    }
    else
    {
        update_next(nod, start, stop);

        int mid = (start + stop) / 2;

        update_arbore(nod * 2, start, mid, itv);
        update_arbore(nod * 2 + 1, mid + 1, stop, itv);

        v[nod].Max = max(v[nod*2].from_right+v[nod*2+1].from_left, max(v[nod*2].Max, v[nod*2+1].Max)) ;

        if (v[nod*2].Max == max_in_interval(start, mid))
            v[nod].from_left = v[nod*2].Max + v[nod*2+1].from_left;
        else
            v[nod].from_left = v[nod*2].from_left;
        if (v[nod*2+1].Max == max_in_interval(mid + 1, stop))
            v[nod].from_right = v[nod*2+1].Max + v[nod*2].from_right;
        else
            v[nod].from_right = v[nod*2+1].from_right;
    }
}

int main()
{
    fin>>n>>m;
    update_arbore(1, 1, n, make_pair(1,n));
    for (i=1;i<=m;i++)
    {
        fin>>c;
        if (c == 1 || c == 2)
        {
            fin>>interval.first>>nr;
            interval.second=interval.first+nr-1;
            update_arbore(1, 1, n, interval);
            //prnt();
        }
        else
        {
            fout<<v[1].Max<<"\n";
        }
    }
    return 0;
}