Cod sursa(job #3146474)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 21 august 2023 11:45:22
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>

using ll = long long;
using namespace std;

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

const ll kInf = 1e15;

void maxSelf(int &x, int y) {
	if(y > x) {
		x = y;
	}
}

void maxSelf(ll &x, ll y) {
	if(y > x) {
		x = y;
	}
}

struct st {
	struct Node {
		ll sum, pref, suff, ssmax;
		Node(ll sum = 0, ll pref = 0, ll suff = 0, ll ssmax = 0): sum(sum), pref(pref), suff(suff), ssmax(ssmax) {}
	};
	friend Node operator + (const Node &l, const Node &r) {
		Node res(l.sum + r.sum, max(l.pref, l.sum + r.pref), max(r.suff, r.sum + l.suff), l.sum + r.sum);
		maxSelf(res.ssmax, l.ssmax);
		maxSelf(res.ssmax, r.ssmax);
		maxSelf(res.ssmax, l.suff + r.pref);
		maxSelf(res.ssmax, res.pref);
		maxSelf(res.ssmax, res.suff);
		return res;
	}
	vector<Node> segTree;
	vector<int> v;
	st() {}
	st(const vector<int> &v): v(v) {
		segTree = vector<Node>(4 * v.size() + 1);
		build(1, 0, v.size() - 1);
	}
	void build(int node, int l, int r) {
		if(l == r) {
			segTree[node] = Node(v[l], v[l], v[l], v[l]);
		} else {
			int m = (l + r) >> 1;
			build(node << 1, l, m);
			build(node << 1 | 1, m + 1, r);
			segTree[node] = segTree[node << 1] + segTree[node << 1 | 1];
		}
	}
	Node query(int a, int b, int node, int l, int r) {
		if(a <= l && r <= b) {
			return segTree[node];
		} else {
			int m = (l + r) >> 1;
			Node res(0, -kInf, -kInf, -kInf);
			if(a <= m) {
				res = res + query(a, b, node << 1, l, m);
			}
			if(b > m) {
				res = res + query(a, b, node << 1 | 1, m + 1, r);
			}
			return res;
		}
	}
};

int main() {
	int n, q;
	fin >> n >> q;
	vector<int> v(n);
	for(auto &it: v) {
		fin >> it;
	}
	st ds(v);
	for(int i = 0; i < q; i++) {
		int a, b;
		fin >> a >> b;
		a--; b--;
		fout << ds.query(a, b, 1, 0, n - 1).ssmax << '\n';
	}
	return 0;
}