#include <iostream>
using namespace std;
const int N=5e5+5;
const int inf=1e9;
int n,v[N];
struct node
{
int suma;
int prefix,sufix;
int ans;
}aint[4*N];
node combine(node x,node y)
{
node c={-inf,-inf,-inf,-inf};
c.suma=x.suma+y.suma;
c.prefix=max(x.prefix,x.suma+y.prefix);
c.sufix=max(y.sufix,y.suma+x.sufix);
c.ans=max(x.prefix+y.sufix,max(x.ans+y.suma,y.ans+x.suma));
return c;
}
void build(int nod,int st,int dr)
{
if(st==dr)
{
aint[nod].prefix=max(v[st],0);
aint[nod].sufix=max(v[st],0);
aint[nod].suma=v[st];
aint[nod].ans=max(v[st],0);
}
else
{
int mij=(st+dr)/2;
build(nod*2,st,mij);
build(nod*2+1,mij+1,dr);
aint[nod]=combine(aint[nod*2],aint[nod*2+1]);
}
}
node query(int nod,int st,int dr,int l,int r)
{
if(l<=st&&dr<=r)
{
return aint[nod];
}
else
if(l>dr||st>r)
{
return {-0,-inf,-inf,-inf};
}
else
{
int mij=(st+dr)/2;
node c=combine(query(nod*2,st,mij,l,r),query(nod*2+1,mij+1,dr,l,r));
return c;
}
}
void read()
{
cin>>n;
for(int i=1;i<=n;i++)
{
char d;
cin>>d;
if(d=='C')
v[i]=-1;
else
v[i]=1 ;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
read();
build(1,1,n);
//cout<<aint[1].ans<<'\n';
int q;
cin>>q;
for(int i=1;i<=q;i++)
{
int l,r;
cin>>l>>r;
cout<<max(query(1,1,n,l,r).ans,0)<<'\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... |