Cod sursa(job #1208866)

Utilizator tudorv96Tudor Varan tudorv96 Data 16 iulie 2014 18:23:43
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda oji_in_iulie_lol Marime 1.42 kb
#include <fstream>
using namespace std;

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

const int N = 1e5 + 5;

typedef long long u64;
const u64 oo = -1e15;

u64 A[N * 4], B[N * 4], C[N * 4], S[N * 4], sol, res;
int n, m, v[N];

void build(int node, int lo, int hi) {
    if (lo == hi) {
        A[node] = B[node] = C[node] = S[node] = v[lo];
        return;
    }
    int mid = (lo + hi) >> 1, fiu = node << 1;
    build(fiu, lo, mid);
    build(fiu + 1, mid + 1, hi);
    A[node] = max (A[fiu], S[fiu] + A[fiu + 1]);
    B[node] = max (B[fiu + 1], S[fiu + 1] + B[fiu]);
    C[node] = max (B[fiu] + A[fiu + 1], max(C[fiu], C[fiu + 1]));
    S[node] = S[fiu] + S[fiu + 1];
}

void query(int node, int lo, int hi, int lt, int rt) {
    if (rt < lo || hi < lt)
        return;
    if (lt <= lo && hi <= rt) {
        sol = max(sol, max(res + A[node], C[node]));
        res += max(res + S[node], B[node]);
        return;
    }
    int mid = (lo + hi) >> 1, fiu = node << 1;
    if (lt <= mid)
        query(fiu, lo, mid, lt, rt);
    if (rt > mid)
        query(fiu + 1, mid + 1, hi, lt, rt);
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        fin >> v[i];
    build(1, 1, n);
    for (int x, y, i = 0; i < m; ++i) {
        fin >> x >> y;
        sol = oo;
        res = 0;
        query(1, 1, n, x, y);
        fout << sol << "\n";
    }
}