#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
pair<int,int> seg[MAXN*4];
int nex[MAXN],pref[MAXN],f[MAXN*2],ans[MAXN];
vector< pair<int,int> > vq[MAXN];
stack<int> st;
pair<int,int> merge(pair<int,int> a,pair<int,int> b)
{
return {a.first+b.first,min(b.second,b.first+a.second)};
}
void update(int l,int r,int i,int val,int pos)
{
if(i<l||r<i) return ;
if(l==r)
{
seg[pos]={seg[pos].first+val,min(0,seg[pos].first+val)};
return ;
}
int mid=(l+r)/2;
update(l,mid,i,val,pos*2);
update(mid+1,r,i,val,pos*2+1);
seg[pos]=merge(seg[pos*2],seg[pos*2+1]);
}
pair<int,int> get(int l,int r,int u,int v,int pos)
{
if(u<=l&&r<=v) return seg[pos];
int mid=(l+r)/2;
if(v<=mid) return get(l,mid,u,v,pos*2);
if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
return merge(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1));
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,q;
string s;
cin>>n>>s>>q;
s=' '+s;
for(int i=0;i<=n*2;i++) f[i]=n+1;
for(int i=1;i<=n;i++) pref[i]=pref[i-1]+(s[i]=='C')-(s[i]=='T');
for(int i=n-1;i+1;i--) f[pref[i+1]+n]=i+1,nex[i]=f[pref[i]+n-1];
for(int i=1;i<=q;i++)
{
int l,r;
cin>>l>>r;
vq[l].push_back({r,i});
}
for(int i=n;i;i--)
{
update(1,n,i,(s[i]=='C')-(s[i]=='T'),1);
while(!st.empty()&&nex[i-1]>=st.top()) update(1,n,st.top(),-1,1),st.pop();
if(nex[i-1]<=n)
{
st.push(nex[i-1]);
update(1,n,nex[i-1],1,1);
}
for(auto v:vq[i]) ans[v.second]=get(1,n,i,v.first,1).first-(pref[v.first]-pref[i-1])-get(1,n,i,v.first,1).second;
}
for(int i=1;i<=q;i++) cout<<ans[i]<<"\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... |