#include<bits/stdc++.h>
using namespace std;
struct Node
{
int sum;
int suf;
int pref;
Node() : sum(0),suf(1e9),pref(1e9){}
};
vector<Node> seg;
vector<int> val;
Node merge(Node n,Node m)
{
Node parent;
parent.sum=n.sum+m.sum;
parent.pref=min(n.pref,n.sum+m.pref);
parent.suf=min(m.suf,m.sum+n.suf);
return parent;
}
void update(int idx,int l,int r)
{
if(l==r)
{
seg[idx].sum=val[l];
seg[idx].suf=val[l];
seg[idx].pref=val[l];
return;
}
int mid=(l+r)/2;
update(2*idx,l,mid);
update(2*idx+1,mid+1,r);
seg[idx]=merge(seg[idx*2],seg[idx*2+1]);
}
Node upit(int idx,int start,int end,int l,int r)
{
if(r<start||l>end) return Node();
if(l<=start&&r>=end)
{
return seg[idx];
}
int mid=(start+end)/2;
Node n=upit(idx*2,start,mid,l,r);
Node m=upit(idx*2+1,mid+1,end,l,r);
if(n.sum==0&&n.pref==1e9&&n.suf==1e9) return m;
if(m.sum==0&&m.pref==1e9&&m.suf==1e9) return n;
return merge(n,m);
}
int main()
{
int len;
cin>>len;
seg.resize(4*len);
val.resize(len);
string s;
cin>>s;
for(int i=0;i<len;i++) val[i]=((s[i]=='T')?-1:1);
update(1,0,len-1);
int q;
cin>>q;
while(q--)
{
int l,r;
cin>>l>>r;
l--;r--;
Node n=upit(1,0,len-1,l,r);
int left=max(0,-n.pref);
int right=max(0,-n.suf);
cout<<max(left,right)<<'\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... |