#include <bits/stdc++.h>
using namespace std;
const int N = 500'000 + 10;
int n, q;
int a[N];
namespace IT {
struct Node {
int pref, suff, sum, best;
Node(int pref = 0, int suff = 0, int sum = 0, int best = 0) : pref(pref), suff(suff), sum(sum), best(best) {}
};
Node merge(const Node& lt, const Node& rt) {
return Node(max(lt.pref, lt.sum + rt.pref), max(rt.suff, rt.sum + lt.suff), lt.sum + rt.sum, max({lt.best + rt.sum, lt.sum + rt.best, lt.pref + rt.suff}));
}
Node f[N << 2];
void build(int s, int l, int r) {
if (l == r) {
if (a[l] == 1) f[s] = Node(0, 0, -1, 0);
else f[s] = Node(1, 1, 1, 1);
return;
}
int mid = (l + r) >> 1;
build(s << 1, l, mid);
build(s << 1 | 1, mid + 1, r);
f[s] = merge(f[s << 1], f[s << 1 | 1]);
}
Node query(int s, int l, int r, int u, int v) {
if (v < l || u > r) return Node();
if (u <= l && r <= v) return f[s];
int mid = (l + r) >> 1;
return merge(query(s << 1, l, mid, u, v), query(s << 1 | 1, mid + 1, r, u, v));
}
}
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
char ch; cin >> ch;
a[i] = (ch == 'C' ? 1 : -1);
}
IT::build(1, 1, n);
cin >> q;
while (q--) {
int l, r; cin >> l >> r;
cout << IT::query(1, 1, n, l, r).best << "\n";
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |