Cod sursa(job #448411)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 3 mai 2010 18:24:04
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
#define NMAX 100010
#define INF 2000000000
long long S[NMAX*3], dr[NMAX*3], st[NMAX*3], t[NMAX*3];
int v[NMAX];
int n, m, a, b;
long long sol;
long long sum, s;
void constr(int p, int q, int i){
	if(p == q){
		S[i] = dr[i] = st[i] = t[i] = v[p];
		return;
	}
	int m = (p+q)>>1;
	constr(p, m, 2*i);
	constr(m+1, q, 2*i+1);
	S[i] = S[2*i] + S[2*i+1];
	st[i] = max(st[2*i], S[2*i] + st[2*i+1]);
	dr[i] = max(dr[2*i+1], S[2*i+1] + dr[2*i]);
	t[i] = max( max(t[2*i], t[2*i+1]), max(st[i], dr[i]));
	t[i] = max(t[i], dr[2*i] + st[2*i+1]);
}
void query(int p, int q, int i){
	if(a <= p && q <= b){
		sol = max(sol, sum + st[i]);
		sol = max(sol, t[i]);
		sum = max(sum + S[i], dr[i]);
		sum = max(sum, (long long)0);
		return ;
	}
	int m = (p+q)>>1;
	if(a <= m) query(p, m, 2*i);
	if(b > m) query(m+1, q, 2*i+1);
}
int main(){
	freopen("sequencequery.in", "r", stdin);
	freopen("sequencequery.out" ,"w", stdout);
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++i)
		scanf("%d", &v[i]);
	constr(1, n, 1);
	for(int i = 1; i <= m; ++i){
		scanf("%d%d", &a, &b);
		sol = -INF;
		sum = 0;
		query(1, n, 1);
		printf("%lld\n", sol);
	}
	return 0;
}