Cod sursa(job #63117)

Utilizator floringh06Florin Ghesu floringh06 Data 26 mai 2007 19:09:08
Problema SequenceQuery Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
using namespace std;
#include <cstdio>
#include <algorithm>

#define FIN "sequencequery.in"
#define FOUT "sequencequery.out"

#define MAX_N (1<<18)
#define max(a, b) ((a) > (b) ? (a) : (b))

int N, M;
int v[MAX_N];
long long A[MAX_N<<1], B[MAX_N<<1], C[MAX_N<<1], Sum[MAX_N<<1];

#define lf (n<<1)
#define rt (lf+1)
#define md ((l+r)>>1)

void build(int n, int l, int r)
{
	if (l == r) {
		A[n] = B[n] = C[n] = max(v[l], 0);
		Sum[n] = v[l];
	} else {
		build(lf, l, md);
		build(rt, md+1, r);

		A[n] = max(A[lf], Sum[lf]+A[rt]);
		B[n] = max(B[lf]+Sum[rt], B[rt]);
		C[n] = max(max(C[lf], C[rt]), B[lf]+A[rt]);
		
		Sum[n] = Sum[lf]+Sum[rt];
	}
}


int a, b;
long long ans, S;

void query(int n, int l, int r) 
{
	if (a <= l && r <= b) {
		if (S < 0) S = 0;
		ans = max(ans, max(S+A[n], C[n]));
		S = max(S+Sum[n], B[n]);
	} else {
		if (a <= md) query(lf,l, md);
		if (b >  md) query(rt, md+1,  r);
	}
}

int main()
{
	int i, t, v1, v2;
	
	freopen(FIN, "r", stdin);
	freopen(FOUT, "w", stdout);

	scanf("%d %d", &N,&M);
	for (i = 1; i <= N; ++i)
		scanf("%d", v+i);
	build(1, 1, N);
	t=1;
	while (M--) 
    {
		scanf("%d %d",&v1, &v2);
			S = ans = 0;
			a = v1;
			b = v2;
			if (a<b) query(1, 1, N);
			 else ans=v[a];

			printf("%lld\n", ans);
	}
	return 0;
}