Submission #888833

#TimeUsernameProblemLanguageResultExecution timeMemory
888833ieeElection (BOI18_election)C++17
100 / 100
311 ms28232 KiB
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 5e5 + 5;
int n, Q;
char s[N];
struct info {
	int ans, sum, pre, suf;
} tr[N << 2];
info pushup(info l, info r) {
	info u;
	u.ans = max({l.pre + r.suf, l.sum + r.ans, r.sum + l.ans});
	u.sum = l.sum + r.sum;
	u.pre = max(l.pre, l.sum + r.pre);
	u.suf = max(r.suf, r.sum + l.suf);
	return u;
}
void build(int u = 1, int l = 1, int r = n) {
	if (l == r) {
		tr[u].sum = s[l];
		tr[u].ans = tr[u].pre = tr[u].suf = max<int>(s[l], 0);
		return;
	}
	int mid = (l + r) / 2;
	build(u * 2, l, mid), build(u * 2 + 1, mid + 1, r);
	tr[u] = pushup(tr[u * 2], tr[u * 2 + 1]);
}
info query(int ql, int qr, int u = 1, int l = 1, int r = n) {
	if (l >= ql && r <= qr) {
		return tr[u];
	}
	int mid = (l + r) / 2;
	if (ql > mid) return query(ql, qr, u * 2 + 1, mid + 1, r);
	if (qr <= mid) return query(ql, qr, u * 2, l, mid);
	return pushup(query(ql, qr, u * 2, l, mid), query(ql, qr, u * 2 + 1, mid + 1, r));
}
int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> s[i];
		s[i] = (s[i] == 'T' ? 1 : -1);
	}
	build();
	cin >> Q;
	while (Q--) {
		int l, r;
		cin >> l >> r;
		cout << query(l, r).ans << "\n";
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...