Cod sursa(job #3261850)

Utilizator CosminaneBoac Mihai Cosmin Cosminane Data 7 decembrie 2024 14:39:34
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
using namespace std;
struct elem {
	long long secv, pre, suf, tot;
};
elem v[263000];
elem fusion(elem a, elem b) {
	elem r;
	if (a.secv == -INT32_MAX) {
		return b;
	}
	if (b.secv == -INT32_MAX) {
		return a;
	}
	r.secv = max( a.suf + b.pre, max( a.secv, b.secv ) );
	r.pre = max( a.pre, a.tot + b.pre );
	r.suf = max( b.suf, b.tot + a.suf );
	r.tot = a.tot + b.tot;
	return r;
}
void modif(int nod, int st, int dr, int x, int val) {
	int mij = ( st + dr ) / 2;
	if (st == x && dr == x) {
		v[nod].secv = v[nod].pre = v[nod].suf = v[nod].tot = val;
	}
	else {
		if (x <= mij) {
			modif( nod * 2, st, mij, x, val );
		}
		else {
			modif( nod * 2 + 1, mij + 1, dr, x, val );
		}
		v[nod] = fusion( v[nod * 2], v[nod * 2 + 1] );
	}
}
elem sum(int nod, int st, int dr, int x, int y) {
	int mij = ( st + dr ) / 2;
	elem r;
	if (x <= st && dr <= y) {
		return v[nod];
	}
	r.secv = -INT32_MAX;
	if (x <= mij) {
		r = fusion( r, sum( nod * 2, st, mij, x, y ) );
	}
	if (y > mij) {
		r = fusion( r, sum( nod * 2 + 1, mij + 1, dr, x, y ) );
	}
	return r;
}
int main() {
	int n, m, i, x, y;
	ifstream fin( "sequencequery.in" );
	ofstream fout( "sequencequery.out" );
	fin >> n >> m;
	for (i = 0; i < n; i++) {
		fin >> x;
		modif( 1, 0, n - 1, i, x );
	}
	for (i = 0; i < m; i++) {
		fin >> x >> y;
		fout << sum( 1, 0, n - 1, x - 1, y - 1 ).secv << '\n';
	}
	return 0;
}