Cod sursa(job #2442274)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 23 iulie 2019 15:40:31
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const long long NMax = 1e5, oo = 1e12;

long long A[4 * NMax], B[4 * NMax], C[4 * NMax], S[4 * NMax], V[NMax + 5], N, T;
struct str{long long a, b, c, s;};

void Build(int i, int st, int dr)
{
    if(st == dr)
    {
        A[i] = B[i] = C[i] = S[i] = V[st];
        return;
    }
    int m = (st + dr) >> 1;

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

    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])));
}

str Querry(int i, int st, int dr, int x, int y)
{
    if(y < st || dr < x)
        return {-oo, -oo, -oo, 0};

    if(x <= st && dr <= y)
        return {A[i], B[i], C[i], S[i]};

    int m = (st + dr) >> 1;
    str L = Querry(2 * i, st, m, x, y), R = Querry(2 * i + 1, m + 1, dr, x, y), Ans;

    Ans.s = L.s + R.s;
    Ans.a = max(max(Ans.s, L.a), L.s + R.a);
    Ans.b = max(max(Ans.s, R.b), L.b + R.s);
    Ans.c = max(max(max(Ans.a, Ans.b), max(L.c, R.c)), max(L.b, max(L.b + R.a, R.a)));

    return Ans;
}

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

    for(int i = 1; i <= N; i++)
        fin >> V[i];

    Build(1, 1, N);
    int a, b;

    while(T--)
    {
        fin >> a >> b;
        fout << Querry(1, 1, N, a, b).c << '\n';
    }
    fin.close();
    fout.close();

    return 0;
}