Cod sursa(job #2432417)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 23 iunie 2019 16:37:27
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>

using namespace std;

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

const int NMax = 400000, oo = -1e7;

int A[NMax + 5], B[NMax + 5], C[NMax + 5], S[NMax + 5], N, M, T[NMax + 5], AIT[NMax + 5];

void Make(int i)
{
    S[i] = S[2 * i] + S[2 * i + 1];
    if(S[i] < 0) S[i] = oo;

    A[i] = max(max(A[2 * i], S[2 * i] + A[2 * i + 1]), max(S[i], S[2 * i]));
    if(A[i] < 0) A[i] = oo;

    B[i] = max(max(B[2 * i + 1], S[2 * i + 1] + B[2 * i]), max(S[2 * i + 1], S[i]));
    if(B[i] < 0) B[i] = oo;

    C[i] = max(max(A[i], B[i]), max(B[2 * i], max(B[2 * i] + A[2 * i + 1], A[2 * i + 1])));
    if(C[i] < 0) C[i] = oo;
}

void Update(int i, int st, int dr, int a, int b, int v)
{
    if(dr < a || b < st || st > dr) return;

    if(a <= st && dr <= b)
    {
        AIT[i] += v, T[i] += v;
        if(AIT[i] == 0)
            A[i] = B[i] = C[i] = S[i] = dr - st + 1;
        else
            A[i] = B[i] = C[i] = S[i] = oo;
        return;
    }
    int m = (st + dr) >> 1;

    if(T[i] != 0)
    {
        Update(2 * i, st, m, st, m, T[i]);
        Update(2 * i + 1, m + 1, dr, m + 1, dr, T[i]);
        T[i] = 0;
    }
    Update(2 * i, st, m, a, b, v);
    Update(2 * i + 1, m + 1, dr, a, b, v);

    Make(i);
}

void Build(int i, int st, int dr)
{
    A[i] = B[i] = S[i] = C[i] = dr - st + 1;
    T[i] = 0;

    if(st == dr) return;
    int m = (st + dr) >> 1;

    Build(2 * i, st, m);
    Build(2 * i + 1, m + 1, dr);
}

int main()
{
    fin >> N >> M;

    Build(1, 1, N);

    while(M--) {
        int p, a, b; fin >> p;

        if(p == 3)
            fout << C[1] << '\n';
        else
        {
            fin >> a >> b;
            if(p == 1)
                Update(1, 1, N, a, b + a - 1, 1);
            else
                Update(1, 1, N, a, a + b - 1, -1);
        }
    }
    fin.close();
    fout.close();

    return 0;
}