Cod sursa(job #2973059)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 30 ianuarie 2023 21:27:52
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>

using namespace std;

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

const long long max_size = 1e5 + 1, max_aint = 4e5 + 1, INF = 1e18 + 1;

struct arb{
    long long bestsumdr, bestsumst, sum, ans;
};

long long a[max_size];
arb aint[max_aint];

arb uniune (arb x, arb y)
{
    arb rez;
    rez.bestsumst = max(x.bestsumst, x.sum + y.bestsumst);
    rez.bestsumdr = max(y.bestsumdr, y.sum + x.bestsumdr);
    rez.sum = x.sum + y.sum;
    rez.ans = max(x.ans, max(y.ans, x.bestsumdr + y.bestsumst));
    return rez;
}

void init (long long l, long long r, long long nod)
{
    if (l == r)
    {
        aint[nod] = {a[l], a[l], a[l], a[l]};
        return;
    }
    long long m = (l + r) / 2;
    init(l, m, 2 * nod);
    init(m + 1, r, 2 * nod + 1);
    aint[nod] = uniune(aint[2 * nod], aint[2 * nod + 1]);
}

arb query (long long l, long long r, long long st, long long dr, long long nod)
{
    if (st <= l && r <= dr)
    {
        return aint[nod];
    }
    long long m = (l + r) / 2;
    if (dr <= m)
    {
        return query(l, m, st, dr, 2 * nod);
    }
    if (st > m)
    {
        return query(m + 1, r, st, dr, 2 * nod + 1);
    }
    arb nodst = query(l, m, st, m, 2 * nod), noddr = query(m + 1, r, m + 1, dr, 2 * nod + 1);
    return uniune(nodst, noddr);
}

signed main ()
{
    long long n, q;
    in >> n >> q;
    for (long long i = 1; i <= n; i++)
    {
        in >> a[i];
    }
    init(1, n, 1);
    while (q--)
    {
        long long x, y;
        in >> x >> y;
        out << query(1, n, x, y, 1).ans << '\n';
    }
    in.close();
    out.close();
    return 0;
}