#include <iostream>
#include <vector>
using namespace std;
struct Vote {
int sum = 0, maxPrefixSum = 0, maxSuffixSum = 0, ans = 0;
Vote() = default;
Vote(char ch) : Vote() {
if (ch == 'C') {
sum = -1;
} else {
sum = maxPrefixSum = maxSuffixSum = ans = 1;
}
}
Vote operator+(const Vote& other) const {
Vote res;
res.sum = sum + other.sum;
res.maxPrefixSum = max(maxPrefixSum, sum + other.maxPrefixSum);
res.maxSuffixSum = max(other.maxSuffixSum, other.sum + maxSuffixSum);
res.ans = max({ans + other.sum, sum + other.ans,
maxPrefixSum + other.maxSuffixSum});
return res;
}
};
struct St {
int n;
vector<Vote> t;
St(int n) : n(n), t(n << 1) {}
void build(const string& s) {
for (size_t i = 0; i < s.size(); ++i) {
t[n + i] = Vote(s[i]);
}
for (int i = n - 1; i > 0; --i) {
t[i] = t[i << 1] + t[i << 1 | 1];
}
}
Vote query(int l, int r) {
Vote resl, resr;
for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
if (l & 1) resl = resl + t[l++];
if (r & 1) resr = t[--r] + resr;
}
return resl + resr;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
string s;
cin >> s;
St st(n);
st.build(s);
int q;
cin >> q;
while (q--) {
int l, r;
cin >> l >> r;
Vote res = st.query(l - 1, r);
cout << res.ans << endl;
}
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... |