Cod sursa(job #1054065)

Utilizator harababurelPuscas Sergiu harababurel Data 13 decembrie 2013 12:38:17
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;
 
int H[4*nmax], L[4*nmax], R[4*nmax], s[nmax], v[nmax];
int n, m, a, b;

int sum(int lo, int hi) { return (s[hi] - s[lo-1]); }
 
void build(int node, int lo, int hi) {
    if(lo == hi) {
        H[node] = L[node] = R[node] = v[lo];
        return;
    }
 
    int mid = (lo + hi) >> 1;
 
    build(2*node, lo, mid);
    build(2*node+1, mid+1, hi);
     
    int a = max(H[2*node], H[2*node+1]);
    int b = max(R[2*node], L[2*node+1]);
    H[node] = max(a, b);
    H[node] = max(H[node], R[2*node] + L[2*node+1]);
 
    L[node] = L[2*node];
    L[node] = max(L[node], sum(lo, mid)+L[2*node+1]);
 
    R[node] = R[2*node+1];
    R[node] = max(R[node], R[2*node]+sum(mid+1, hi));
 
}
 
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;
		//query(a, b);
	}

	//for(int i=1; i<=15; i++) cout<<"node = "<<i<<" - H="<<H[i]<<" L="<<L[i]<<" R="<<R[i]<<"\n";
	

	return 0;
}