Cod sursa(job #1928978)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 16 martie 2017 22:14:32
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <algorithm>
#include <unordered_map>

using namespace std;

const int N = 200000;
int v[N];

struct node{
    long long bst, pref, suf, sum;
}aint[N*4];

const long long INF = -2e15;
int qlf, qrg, val;

node combine (node l, node r) {
	node res;
	res.sum = l.sum + r.sum;
	res.pref = max (l.pref, l.sum + r.pref);
	res.suf = max (r.suf, r.sum + l.suf);
	res.bst = max (max (l.bst, r.bst), l.suf + r.pref);
	return res;
}

void build(int pos, int lf, int rg){
    if(lf == rg){
        aint[pos].pref = v[lf];
        aint[pos].suf = v[lf];
        aint[pos].bst = v[lf];
        aint[pos].sum = v[lf];
        return;
    }
    int md = (lf + rg)/2;
    build(2 * pos, lf, md);
    build(2 * pos + 1, md + 1, rg);
    aint[pos] = combine(aint[2 * pos], aint[2 * pos + 1]);
}

node query(int pos, int lf, int rg){
	if(rg < qlf || lf > qrg){
		node t;
		t.bst = t.pref = t.suf = t.sum = INF;
		return t;
	}
    if(qlf <= lf && rg <= qrg){
        return aint[pos];
    }
    int md = (lf + rg)/2;
    return combine(query(2 * pos, lf, md), query(2 * pos + 1, md + 1, rg));
}

int main(){
    int n,i,q;
    freopen("sequencequery.in", "r", stdin);
    freopen("sequencequery.out", "w", stdout);
    scanf("%d %d", &n, &q);
    for(i = 1;i <= n;i++){
        scanf("%d", &v[i]);
    }
    build(1, 1, n);
    for(i = 1;i <= q;i++){
        scanf("%d %d", &qlf, &qrg);
        printf("%lld\n", query(1, 1, n).bst);
    }
    return 0;
}