Cod sursa(job #2443081)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 26 iulie 2019 13:27:59
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>

using namespace std;

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

const int NMax = 400000, oo = 1e8;
long long A[NMax + 5], B[NMax + 5], C[NMax + 5], S[NMax + 5], N, M, T[NMax + 5];

void Make(int i)
{
    S[i] = S[2 * i] + S[2 * i + 1];
    A[i] = max(max(S[i], A[2 * i]), S[2 * i] + A[2 * i + 1]);
    B[i] = max(max(S[i], B[2 * i + 1]), B[2 * i] + S[2 * i + 1]);
    C[i] = max(max(max(A[i], B[i]), max(C[2 * i], C[2 * i + 1])), max(B[2 * i], max(B[2 * i] + A[2 * i + 1], A[2 * i + 1])));
}

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

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

    if(T[i])
    {
        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)
        {
            if(C[1] < 0)
                fout << "0\n";
            else
                fout << C[1] << '\n';
        }
        else
        {
            fin >> a >> b;
            if(p == 1)
                Update(1, 1, N, a, b + a - 1, -oo);
            else
                Update(1, 1, N, a, a + b - 1, 1);
        }
    }
    fin.close();
    fout.close();

    return 0;
}