#include <bits/stdc++.h>
using namespace std;
struct Node {
int sum;
int minPref;
int minSuff;
};
Node mergeNode(const Node &A, const Node &B) {
Node res;
res.sum = A.sum + B.sum;
res.minPref = min(A.minPref, A.sum + B.minPref);
res.minSuff = min(B.minSuff, B.sum + A.minSuff);
return res;
}
class SegmentTree {
private:
int n;
vector<Node> tree;
void build(int idx, int l, int r, const vector<int> &arr) {
if (l == r) {
tree[idx].sum = arr[l];
tree[idx].minPref = min(0, arr[l]);
tree[idx].minSuff = min(0, arr[l]);
return;
}
int mid = (l + r) / 2;
build(2 * idx, l, mid, arr);
build(2 * idx + 1, mid + 1, r, arr);
tree[idx] = mergeNode(tree[2 * idx], tree[2 * idx + 1]);
}
Node query(int idx, int l, int r, int ql, int qr) {
if (ql > r || qr < l) {
return {0, 0, 0};
}
if (ql <= l && r <= qr) {
return tree[idx];
}
int mid = (l + r) / 2;
Node left = query(2 * idx, l, mid, ql, qr);
Node right = query(2 * idx + 1, mid + 1, r, ql, qr);
return mergeNode(left, right);
}
public:
SegmentTree(const vector<int> &arr) {
n = arr.size();
tree.resize(4 * n);
build(1, 0, n - 1, arr);
}
int getAnswer(int l, int r) {
Node res = query(1, 0, n - 1, l, r);
return max(-res.minPref, -res.minSuff);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
string s;
cin >> s;
vector<int> arr(N);
for (int i = 0; i < N; i++) {
arr[i] = (s[i] == 'C' ? 1 : -1);
}
SegmentTree st(arr);
int Q;
cin >> Q;
while (Q--) {
int L, R;
cin >> L >> R;
cout << st.getAnswer(L - 1, R - 1) << "\n";
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |