#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define vl vector<ll>
#define vi vector<int>
#define pll pair<ll, ll>
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define pb push_back
#define sz(v) (int)(v.size())
#define f first
#define s second
using namespace std;
const ll sz = 2e6+5;
struct nd{
ll l, r, sm, ans;
}segtree[sz];
ll a[sz];
void build(ll v, ll l, ll r)
{
if(l == r)
{
if(a[l] == -1)
{
segtree[v].l = segtree[v].r = segtree[v].ans = 0;
segtree[v].sm = -1;
}
else
segtree[v].l = segtree[v].r = segtree[v].sm = segtree[v].ans = 1;
}
else
{
ll mid = (l + r) / 2;
build(2*v, l, mid);
build(2*v+1, mid+1, r);
nd nw;
nw.l = max(segtree[2*v].l, segtree[2*v].sm + segtree[2*v+1].l);
nw.r = max(segtree[2*v+1].r, segtree[2*v+1].sm + segtree[2*v].r);
nw.sm = segtree[2*v].sm + segtree[2*v+1].sm;
nw.ans = max({segtree[2*v].l + segtree[2*v+1].r, segtree[2*v].ans + segtree[2*v+1].sm, segtree[2*v].sm + segtree[2*v+1].ans});
segtree[v] = nw;
}
}
nd query(ll v, ll l, ll r, ll tl, ll tr)
{
if(tl > tr)
return {0, 0, 0, 0};
if(l == tl && r == tr)
return segtree[v];
ll mid = (l + r) / 2;
nd lans = query(2*v, l, mid, tl, min(mid, tr));
nd rans = query(2*v+1, mid+1, r, max(mid+1, tl), tr);
nd nw;
nw.l = max(lans.l, lans.sm + rans.l);
nw.r = max(rans.r, rans.sm + lans.r);
nw.sm = lans.sm + rans.sm;
nw.ans = max({lans.l + rans.r, lans.ans + rans.sm, lans.sm + rans.ans});
return nw;
}
void solve()
{
ll n, q, i, j;
cin >> n;
string s;
cin >> s;
s = "#" + s;
for(i = 1; i <= n; i++)
{
if(s[i] == 'C')
a[i] = -1;
else
a[i] = 1;
}
build(1, 1, n);
cin >> q;
while(q--)
{
ll l, r;
cin >> l >> r;
cout << query(1, 1, n, l, r).ans << "\n";
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int tests = 1;
//cin >> tests;
while(tests--)
{
solve();
}
}