Cod sursa(job #1718582)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 18 iunie 2016 13:29:23
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");

const int NMAX = 100009;
const int INF = 0x3f3f3f3f;

int n; int m;

struct Interval {

	int sum;
	int sl;
	int sr;
	int seq;

	Interval() : sum(-INF) , sl(-INF), sr(-INF), seq(-INF) { }
	Interval(int _sum, int _sl, int _sr, int _seq) : sum(_sum), sl(_sl) , sr(_sr), seq(_seq) { }
};

Interval a[NMAX * 4];

Interval update(int nod, int st, int dr, int pos, int value) {

	if(st == dr) {

		a[nod].sum = a[nod].sl = a[nod].sr = a[nod].seq = value; //minimum 1 element
		return a[nod];
	}
	
	int mid = (st + dr) / 2;
	
	if(pos <= mid)
		a[nod * 2] = update(nod * 2, st, mid, pos, value);
	else 
		a[nod * 2 + 1] = update(nod * 2 + 1, mid + 1, dr, pos, value);

	a[nod].seq = max(a[nod * 2].seq, a[nod * 2 + 1].seq);
	if(a[nod].seq < a[nod * 2].sr + a[nod * 2 + 1].sl)
		a[nod].seq = a[nod * 2].sr + a[nod * 2 + 1].sl;

	a[nod].sum = a[nod * 2].sum + a[nod * 2 + 1].sum;
	a[nod].sl = max(a[nod * 2].sl , a[nod * 2].sum + a[nod * 2 + 1].sl);
	a[nod].sr = max(a[nod * 2 + 1].sr, a[nod * 2 + 1].sum + a[nod * 2].sr);

	return a[nod];
}

Interval query(int nod, int st, int dr, int left, int right) {

	if(left <= st && dr <= right)
		return a[nod];

	int mid = (st + dr) / 2;

	//st mid dr
	Interval l;
	Interval r;
	Interval x;

	if(left <= mid)
		l = query(nod * 2, st , mid, left, right);
	if(mid + 1 <= right)
		r = query(nod * 2 + 1, mid + 1, dr, left, right);
	 	
	x.seq = max(l.seq, max(r.seq, l.sr + r.sl));
	x.sl = max(l.sum + r.sl, l.sl);
	x.sr = max(r.sum + l.sr, r.sr);
	x.sum = l.sum + r.sum;

	return x;
}

int main() {

	fin >> n >> m;

	for(int i = 1; i <= n ; ++i) {
		int x; fin >> x;
		update(1, 1, n, i, x);
	}

	while(m--) {
		int x; int y;
		fin >> x >> y;
		Interval q = query(1, 1, n, x, y);
		fout << q.seq << '\n'; 
	}	
	return 0;
}