Cod sursa(job #1604384)

Utilizator T.C.11Tolan Cristian T.C.11 Data 18 februarie 2016 10:51:17
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>

using namespace std;

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

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

int n,m,i,j,a,b,nr,c;

void update_arbore(int nod, int start, int stop, int pos)
{
    if (start == stop)
    {
        v[nod].ocupat = !v[nod].ocupat;
        if (v[nod].ocupat == true)
        {
            v[nod].Max = 1;
            v[nod].from_left = 1;
            v[nod].from_right = 1;
        }
        else
        {
            v[nod].Max = 0;
            v[nod].from_left = 0;
            v[nod].from_right = 0;
        }
    }
    else
    {
        int mid = (start + stop ) / 2;
        if (pos <= mid)
            update_arbore(nod * 2, start, mid, pos);
        else
            update_arbore(nod * 2 + 1, mid + 1, stop, pos);
        v[nod].Max = v[nod*2].Max+v[nod*2+1].Max;
        if (v[nod*2].from_left == v[nod*2].Max)
            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].from_right == v[nod*2+1].Max)
            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;
    for (i=1;i<=n;i++)
    {
        update_arbore(1, 1, n, i);
    }
    for (i=1;i<=m;i++)
    {
        fin>>c;
        if (c == 1 || c == 2)
        {
            fin>>a>>nr;
            b=a+nr-1;
            for (j=a;j<=b;j++)
            {
                update_arbore(1, 1, n, j);
            }
        }
        else
        {
            fout<<v[1].Max<<"\n";
        }
    }
    return 0;
}