# include <iostream>
using namespace std;
const int MAX=5e5+11;
int n,q;
char a[MAX];
struct node
{
int sum,pref,suf,ans;
node friend operator + (node A, node B)
{
if(A.ans==-1) return B;
if(B.ans==-1) return A;
node res;
res.sum=A.sum+B.sum;
res.pref=max(A.pref,A.sum+B.pref);
res.suf=max(B.suf,A.suf+B.sum);
res.ans=max(max(A.ans+B.sum,A.sum+B.ans),A.pref+B.suf);
return res;
}
};
node tree[MAX*4];
void build(int v=1, int l=1, int r=n)
{
if(l==r)
{
if(a[l]=='C') tree[v]={-1,0,0,0};
else tree[v]={1,1,1,1};
return ;
}
int mid=(l+r)/2;
build(v*2,l,mid);
build(v*2+1,mid+1,r);
tree[v]=tree[v*2]+tree[v*2+1];
}
node query(int le, int ri, int v=1, int l=1, int r=n)
{
if(ri<l or r<le) return {-1,-1,-1,-1};
if(le<=l and r<=ri) return tree[v];
int mid=(l+r)/2;
return query(le,ri,v*2,l,mid)+query(le,ri,v*2+1,mid+1,r);
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
build();
cin>>q;
while(q--)
{
int l,r;
cin>>l>>r;
cout<<query(l,r).ans<<"\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... |