#include <bits/stdc++.h>
using namespace std;
struct node{
int sm, lmax, rmax, sol;
node operator+(node b){
node res;
res.sm = sm+b.sm;
res.lmax = max(lmax, b.lmax+sm);
res.rmax = max(b.rmax, rmax+b.sm);
res.sol = max(max(lmax + b.rmax, sm+b.sol), sol+b.sm);
return res;
}
};
struct segtree{
int n; vector<node> t;
void build(vector<int> &a){
t.resize(2*(n = a.size()));
for(int i = 0; i<n; i++) t[i+n] = node{a[i], max(a[i], 0), max(a[i], 0), max(a[i], 0)};
for(int i = n-1; i>0; i--) t[i] = t[i<<1] + t[i<<1|1];
}
int q(int l, int r){
node lq{0, 0, 0, 0}, rq{0, 0, 0, 0};
for(l+=n, r+=n; l<=r; l>>=1, r>>=1){
if(l&1) lq = lq+t[l++];
if(!(r&1)) rq = t[r--]+rq;
}
return (lq+rq).sol;
}
};
int main(){
iostream::sync_with_stdio(0);
cin.tie(0);
int n; cin >> n;
string s; cin >> s;
vector<int> vec(n);
for(int i = 0; i<n; i++) vec[i] = (s[i] == 'C' ? -1 : 1);
segtree seg;
seg.build(vec);
int q; cin >> q;
while(q--){
int l, r;
cin >> l >> r;
cout << seg.q(--l, --r) << '\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... |