Cod sursa(job #2714295)

Utilizator sichetpaulSichet Paul sichetpaul Data 1 martie 2021 17:36:54
Problema SequenceQuery Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>
#define Nmax 100002
#define ll long long
using namespace std;

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

int N, Q, Max;
int v[Nmax], le[Nmax], ri[Nmax], tree[4 * Nmax];
ll sum[Nmax], sum1[Nmax], sum2[Nmax], ssm;

void update(int node, int le, int ri, int pos, int val) {
    if (le == ri) tree[node] = val;
    else {
        int mid = (le + ri) / 2;
        if (pos <= mid) update(2 * node, le, mid, pos, val);
        else update(2 * node + 1, mid + 1, ri, pos, val);
        tree[node] = max(tree[2 * node], tree[2 * node] + 1) ;
    }
}
void query(int node, int le, int ri, int a, int b) {
    if (le >= a && ri <= b) Max = max(Max, tree[node]);
    else {
        int mid = (le + ri) / 2;
        if (a <= mid) query(2 * node, le, mid, a, b);
        if (mid < b) query(2 * node + 1, mid + 1, ri, a, b);
    }
}

ll calc(int x, int y) {
    ll ans = sum[y] - sum[x - 1];
    int i = le[x], j = ri[y];
    if (sum1[x] >= 0) i = x - 1;
    if (sum2[y] >= 0) j = y + 1;

    if (i >= j) {
         Max = -Nmax;
         query(1, 1, N, x, y);
         return Max;
    }
    return ans - (sum[i] - sum[x - 1]) - (sum[y] - sum[j - 1]);
}
int main()
{
    fin >> N >> Q;
    for (int i = 1; i <= 4 * N; ++i)
        tree[i] = -Nmax;
    for (int i = 1; i <= N; ++i)
        fin >> v[i], sum[i] = sum[i - 1] + v[i], update(1, 1, N, i, v[i]);

    ri[1] = 1, sum2[1] = ssm = v[1];
    for (int i = 2; i <= N; ++i) {
        ri[i] = ri[i - 1];
        if (v[i] < ssm + v[i]) ssm = v[i], ri[i] = i;
        else ssm += v[i];
        sum2[i] = ssm;
    }

    le[N] = N, sum1[N] = ssm = v[N];
    for (int i = N - 1; i >= 1; --i) {
        le[i] = le[i + 1];
        if (v[i] < ssm + v[i]) ssm = v[i], le[i] = i;
        else ssm += v[i];
        sum1[i] = ssm;
    }


    while (Q--) {
        int x, y;
        fin >> x >> y;
        fout << calc(x, y) << '\n';
    }

    return 0;
}