Cod sursa(job #163067)

Utilizator stef2nStefan Istrate stef2n Data 21 martie 2008 11:56:44
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
using namespace std;

const int MAX_TREE = 262144;

int N;
int S[MAX_TREE], L[MAX_TREE], R[MAX_TREE];

void build(int n, int lo, int hi)
{
    S[n] = L[n] = R[n] = hi - lo + 1;
    if(lo == hi)
        return;
    build(2 * n, lo, (lo + hi) / 2);
    build(2 * n + 1, (lo + hi) / 2 + 1, hi);
}

void update(int n, int lo, int hi, const int &A, const int &B, const bool &type)
{
    if(A <= lo && hi <= B)
    {
        if(!type)
            S[n] = L[n] = R[n] = hi - lo + 1;
        else
            S[n] = L[n] = R[n] = 0;
        return;
    }
    if(S[n] == 0)
    {
        S[2 * n] = L[2 *n] = R[2 * n] = 0;
        S[2 * n + 1] = L[2 * n + 1] = R[2 * n + 1] = 0;
    }
    else
        if(S[n] == hi - lo + 1)
        {
            S[2 * n] = L[2 *n] = R[2 * n] = (lo + hi) / 2 - lo + 1;
            S[2 * n + 1] = L[2 * n + 1] = R[2 * n + 1] = hi - (lo + hi) / 2;
        }
    if(A <= (lo + hi) / 2)
        update(2 * n, lo, (lo + hi) / 2, A, B, type);
    if(B > (lo + hi) / 2)
        update(2 * n + 1, (lo + hi) / 2 + 1, hi, A, B, type);
    S[n] = max(max(S[2 * n], S[2 * n + 1]), R[2 * n] + L[2 * n + 1]);
    L[n] = L[2 * n];
    if(L[2 * n] == (lo + hi) / 2 - lo + 1)
        L[n] += L[2 * n + 1];
    R[n] = R[2 * n + 1];
    if(R[2 * n + 1] == hi - (lo + hi) / 2)
        R[n] += R[2 * n];
}


int main()
{
    ifstream in("hotel.in");
    ofstream out("hotel.out");
    int P, op, v1, v2;
    in >> N >> P;
    build(1, 1, N);
    for(int i = 0; i < P; ++i)
    {
        in >> op;
        switch(op)
        {
            case 1:
                in >> v1 >> v2;
                update(1, 1, N, v1, v1 + v2 - 1, true);
                break;
            case 2:
                in >> v1 >> v2;
                update(1, 1, N, v1, v1 + v2 - 1, false);
                break;
            default:
                out << S[1] << "\n";
        }
    }
    return 0;
}