#include <iostream>
using namespace std;
string s;
int n, q;
struct node{
int ans = 0, sum = 0, mxPre = 0, mxSuf = 0;
node operator*(node b){
node res;
res.sum = sum + b.sum;
res.mxPre = max(mxPre, sum + b.mxPre);
res.mxSuf = max(b.mxSuf, b.sum + mxSuf);
res.ans = max(max(ans + b.sum, sum + b.ans), mxPre + b.mxSuf);
return res;
}
} seg[1<<20], nodeAns, dummy;
void build(int cur = 1, int st = 1, int en = n + 1){
if (en - st == 1){
if (s[st - 1] == 'T')
seg[cur].ans = seg[cur].sum = seg[cur].mxPre = seg[cur].mxSuf = 1;
else
seg[cur].sum = -1;
return;
}
int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
build(lc, st, mid);
build(rc, mid, en);
seg[cur] = seg[lc] * seg[rc];
}
void get(int l, int r, int cur = 1, int st = 1, int en = n + 1){
if (l >= en or r <= st)
return;
if (l <= st and r >= en){
nodeAns = nodeAns * seg[cur];
return;
}
int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
get(l, r, lc, st, mid);
get(l, r, rc, mid, en);
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin>>n>>s>>q;
build();
for (int i=1, l, r;i<=q;i++){
cin>>l>>r;
nodeAns = dummy;
get(l, r + 1);
cout<<nodeAns.ans<<'\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... |