Cod sursa(job #2714384)

Utilizator sichetpaulSichet Paul sichetpaul Data 1 martie 2021 18:55:45
Problema SequenceQuery Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
#define Nmax 100002
#define INF -(1LL << 60)
#define ll long long
using namespace std;

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

int N, Q, Max;
int v[Nmax];
ll sum[4 * Nmax], le[4 * Nmax], ri[4 * Nmax], bst[4 * Nmax], ans, curr;

void update(int node, int l, int r, int pos, int val) {
    if (l == r)
        le[node] = ri[node] = bst[node] = sum[node] = val;
    else {
        int mid = (l + r) / 2, x = 2 * node, y = 2 * node + 1;
        if (pos <= mid) update(x, l, mid, pos, val);
        else update(y, mid + 1, r, pos, val);

        le[node] = max(le[x], sum[x] + le[y]);
        ri[node] = max(ri[y], ri[x] + sum[y]);
        sum[node] = sum[x] + sum[y];
        bst[node] = max(bst[x], bst[y]);
        bst[node] = max(bst[node], max(sum[node], max(le[node], ri[node])));
    }
}
void query(int node, int l, int r, int a, int b) {
    if (l >= a && r <= b) {
        ans = max(ans, curr + le[node]);
        ans = max(ans, bst[node]);
        curr = max(curr + sum[node], ri[node]);
    }
    else {
        int mid = (l + r) / 2;
        if (a <= mid) query(2 * node, l, mid, a, b);
        if (mid < b) query(2 * node + 1, mid + 1, r, a, b);
    }
}
int main()
{
    fin >> N >> Q;
    for (int i = 1; i <= 4 * N; ++i)
        sum[i] = le[i] = ri[i] = bst[i] = INF;
    for (int i = 1; i <= N; ++i)
        fin >> v[i], update(1, 1, N, i, v[i]);

    while (Q--) {
        int x, y;
        fin >> x >> y;
        ans = INF, curr = 0;
        query(1, 1, N, x, y);
        fout << ans << '\n';
    }

    return 0;
}