Cod sursa(job #1789361)

Utilizator grimmerFlorescu Luca grimmer Data 26 octombrie 2016 21:57:03
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
using namespace std;

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

const int NMAX = 1e5;
const long long INF = 1e18;

struct elem{
    long long s, m, ls, rs;
} st[4 * NMAX + 5];

int v[NMAX + 5], n, m;

void Build(int node, int l, int r){
    if(l == r){

        st[node].ls = v[l];
        st[node].m = v[l];
        st[node].rs = v[l];
        st[node].s = v[l];

        return;
    }

    int m = (l + r) / 2;
    int Ls = node * 2, Rs = Ls + 1;

    Build(Ls, l, m);
    Build(Rs, m + 1, r);

    st[node].s = st[Ls].s + st[Rs].s;
    st[node].ls = max(st[Ls].ls, st[Ls].s + st[Rs].ls);
    st[node].rs = max(st[Rs].rs, st[Rs].s + st[Ls].rs);
    st[node].m = max(st[Rs].ls + st[Ls].rs, max(st[Ls].m, st[Rs].m));

}

void Query(int node, int l, int r, int ql, int qr, long long& curr_best, long long& ans){

    if(qr < l || ql > r) return;

    if(ql <= l && qr >= r){
        ans = max(ans, max(curr_best + st[node].ls, st[node].m));
        curr_best = max(curr_best + st[node].s, st[node].rs);
        return;
    }

    int m = (l + r) / 2;
    int Ls = 2 * node, Rs = Ls + 1;

    Query(Ls, l, m, ql, qr, curr_best, ans);
    Query(Rs, m + 1, r, ql, qr, curr_best, ans);

}

int main()
{
    int i, a, b;
    fin>>n>>m;

    for(i = 1; i <= n; ++i){
        fin>>v[i];
    }

    Build(1, 1, n);

    for(i = 1; i <= m; ++i){
        fin>>a>>b;

        long long ans = -INF;
        long long curr_best = -INF;

        Query(1, 1, n, a, b, curr_best, ans);
        fout<<ans<<"\n";

    }
    return 0;
}