Cod sursa(job #1474963)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 23 august 2015 11:45:44
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <cstdio>
#include <algorithm>

#define NMAX 100007

using namespace std;
FILE *fin, *fout;
int n, p, c, in, m, tip;
struct arbore
{
    int sol;
    int prefix;
    int sufix;
} arb[3*NMAX];

void init(int st, int dr, int nod)
{
    arb[nod].sol = dr -st + 1;
    arb[nod].prefix = dr -st + 1;
    arb[nod].sufix = dr -st + 1;
    if(st == dr)return ;
    int mij = (st+dr)/2;
    init(st, mij, 2*nod);
    init(mij+1, dr, 2*nod+1);
}
void pun(int st, int dr, int st1, int dr1, int nod)
{
    if(st == st1 && dr == dr1)
    {
        if(c == 1) {arb[nod].sol = 0;arb[nod].prefix = 0;arb[nod].sufix = 0;}
        if(c == 2) {arb[nod].sol = dr -st + 1;arb[nod].prefix = dr -st + 1;arb[nod].sufix = dr -st + 1;}
        return ;
    }
    int Sfiu = 2*nod, Dfiu = 2*nod+1, mij = (st+dr) >>1, f = 1;
    if(arb[nod].sol == 0)
    {
        arb[Sfiu].sol = 0;arb[Sfiu].prefix = 0;arb[Sfiu].sufix = 0;
        arb[Dfiu].sol = 0;arb[Dfiu].prefix = 0;arb[Dfiu].sufix = 0;
    }
    if(arb[nod].sol == dr -st +1)
    {
        arb[Sfiu].sol = mij - st + 1;arb[Sfiu].prefix = mij - st + 1;arb[Sfiu].sufix = mij - st + 1;
        arb[Dfiu].sol = dr - mij;arb[Dfiu].prefix = dr - mij;arb[Dfiu].sufix = dr - mij;
    }
    if(dr1 <= mij)
    {
        f = 0;
        pun(st, mij, st1, dr1, Sfiu);
    }
    if(st1 > mij)
    {
        f = 0;
        pun(mij+1, dr, st1, dr1, Dfiu);
    }
    if(f)
    {
        pun(st, mij, st1, mij, Sfiu);
        pun(mij+1, dr, mij+1, dr1, Dfiu);
    }
    arb[nod].prefix = arb[Sfiu].prefix + ((arb[Sfiu].prefix == mij - st +1)? arb[Dfiu].prefix : 0);
    arb[nod].sufix = arb[Dfiu].sufix + ((arb[Dfiu].sufix == dr - mij)? arb[Sfiu].sufix : 0);
    arb[nod].sol = max(arb[Sfiu].sufix + arb[Dfiu].prefix, max(arb[Sfiu].sol, arb[Dfiu].sol));
}

int main()
{
    fin = freopen("hotel.in", "r", stdin);
    fout = freopen("hotel.out", "w", stdout);
    scanf("%d%d", &n, &p);
    init(1, n, 1);
    for(int i = 1; i<= p; ++i)
    {
        scanf("%d", &c);
        if(c < 3)
        {
            scanf("%d%d", &in, &m);
            m+= in -1;
            pun(1, n, in, m, 1);
        }
        if(c == 3)
        {
            printf("%d\n", arb[1].sol);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}