Cod sursa(job #1157135)

Utilizator andreiagAndrei Galusca andreiag Data 28 martie 2014 11:48:29
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <string.h>

using namespace std;
const int Nmax = (1 << 18) + 5;

int S[Nmax], L[Nmax], R[Nmax];

inline int max(int x, int y) { return x > y ? x : y; }
void update(int nod, int st, int dr, int a, int b, int val)
{
    if (a <= st && dr <= b)
    {
        S[nod] = L[nod] = R[nod] = val * (dr-st+1);
        return;
    }
    int mid = (st + dr)/2;
    if (S[nod] == dr-st+1)
    {
        S[2*nod] = L[2*nod] = R[2*nod] = mid - st + 1;
        S[2*nod+1] = L[2*nod+1] = R[2*nod+1] = dr - mid;
    }
    else if (S[nod] == 0)
    {
        S[2*nod] = L[2*nod] = R[2*nod] = 0;
        S[2*nod+1] = L[2*nod+1] = R[2*nod+1] = 0;
    }
    
    if (a <= mid) update(2*nod, st, mid, a, b, val);
    if (mid < b) update(2*nod+1, mid+1, dr, a, b, val);
    L[nod] = L[2*nod];
    R[nod] = R[2*nod + 1];
    if (L[2*nod] == mid - st + 1) L[nod] += L[2*nod + 1];
    if (R[2*nod+1] == dr - mid) R[nod] += R[2*nod];
    S[nod] = max(S[2*nod], S[2*nod+1]);
    S[nod] = max(S[nod], R[2*nod] + L[2*nod+1]);
    return;
}

int main()
{
    ifstream f ("hotel.in");
    ofstream g ("hotel.out");
    int N, P, q, i, M;
    f >> N >> P;
    update (1, 1, N, 1, N, 1); // toate libere
    while(P--)
    {
        f >> q;
        if (q == 3)
            g << S[1] << '\n';
        else {
            f >> i >> M;
            if (q == 1)
                update(1, 1, N, i, i+M-1, 0); // camere ocupate
            else if (q == 2)
                update(1, 1, N, i, i+M-1, 1); // camere lbere
        }
    }

    return 0;
}