Cod sursa(job #1058017)

Utilizator harababurelPuscas Sergiu harababurel Data 14 decembrie 2013 22:41:43
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <fstream>
#define nmax 100005
#define inf (1LL<<60)
#define ll long long
using namespace std;

ll v[nmax], s[nmax], H[4*nmax], L[4*nmax], R[4*nmax];
ll n, m, currSum, bestSum, a, b;

ll sum(int lo, int hi) { return (s[hi] - s[lo-1]); }
ll max(ll a, ll b) { return a > b? a : b; }

void build(int node, int lo, int hi) {
	if(lo == hi) {
		L[node] = H[node] = R[node] = v[lo];
		return;
	}

	int mid = (lo + hi) >> 1;
	build(2*node, lo, mid);
	build(2*node+1, mid+1, hi);

	H[node] = max(max(H[2*node], H[2*node+1]), R[2*node]+L[2*node+1]);

	L[node] = max(L[2*node], sum(lo, mid) + L[2*node+1]);
	R[node] = max(R[2*node+1], R[2*node] + sum(mid+1, hi));
}

void query(int node, int lo, int hi, int a, int b) {
	if(a <= lo && hi <= b) {
		bestSum = max(max(bestSum, H[node]), max(currSum, currSum + L[node]));
		currSum = max(currSum + sum(lo, hi), R[node]);
		return;
	}

	int mid = (lo + hi) >> 1;

	if(a <= mid) query(2*node, lo, mid, a, b);
	if(mid < b)  query(2*node+1, mid+1, hi, a, b);
}

int main() {
	ifstream f("sequencequery.in");
	ofstream g("sequencequery.out");

	f>>n>>m;
	for(int i=1; i<=n; i++) { f>>v[i]; s[i] = s[i-1] + v[i]; }

	build(1, 1, n);

	for(int i=1; i<=m; i++) {
		f>>a>>b;
		bestSum = currSum = -inf;

		query(1, 1, n, a, b);
		g<<bestSum<<"\n";
	}

	return 0;
}