Cod sursa(job #3230399)

Utilizator teodora_lauraTeodora teodora_laura Data 21 mai 2024 09:26:14
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
//https://kilonova.ro/problems/304
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
typedef long long ll;
const ll N = 100005;
const ll INF = 1e5 + 27;


struct node {
	ll maxpref, maxsuf, best, sum;
};

ll n, m;
ll minpref;
vector<ll>v(N),sume(N);
node arb[N * 4];


void update(ll nod, ll st, ll dr, ll poz, ll val)
{
	if (st == dr) {
			arb[nod].maxpref = v[st];
			arb[nod].maxsuf = v[st];
			arb[nod].best = v[st];
			arb[nod].sum = v[st];
		}
	else {
		ll mij = (st + dr) / 2;
		if (poz <= mij)
			update(nod * 2, st, mij, poz, val);
		if (poz > mij)
			update(2 * nod + 1, mij + 1, dr, poz, val);

		arb[nod].sum = arb[2 * nod].sum + arb[2 * nod + 1].sum;
		arb[nod].maxpref = max(arb[2 * nod].maxpref, arb[2 * nod].sum + arb[2 * nod + 1].maxpref);
		arb[nod].maxsuf = max(arb[2 * nod + 1].maxsuf, arb[2 * nod].maxsuf + arb[2 * nod + 1].sum);
		arb[nod].best = max({ arb[2 * nod].best,
			arb[2 * nod + 1].best,
			arb[2 * nod].maxsuf + arb[2 * nod + 1].maxpref });
	}
			
}

ll maxsum, prefix;

void query(ll nod, ll st, ll dr,ll qst, ll qdr) {
	if (qst <= st && dr <= qdr)
	{
		maxsum = max(arb[nod].best,maxsum);
		maxsum = max(maxsum, prefix + arb[nod].maxpref);
		prefix = max(prefix + arb[nod].sum, arb[nod].maxsuf);
	}
	else
	{
		ll mij = (st + dr) / 2;
		if (qst <= mij)
			 query(2 * nod, st, mij, qst, qdr);
		if (qdr > mij)
			 query(2 * nod + 1, mij + 1, dr, qst, qdr);
	}
}

int main() {
	f >> n >> m;
	for (ll i = 1; i <= n; i++)
	{
		f >> v[i];
		update(1, 1, n, i, v[i]);
	}
	/*for (int i = 1; i <= 4 * n; i++)
		cout << i << ": " << arb[i].maxpref << " " << arb[i].maxsuf << " " << arb[i].best << "\n";
	*/
	while (m--) {
		ll a, b;
		f >> a >> b;
		maxsum =- INF;
		prefix = 0;
		query(1, 1, n, a, b);
		g << maxsum << "\n";

	}
}