// https://oj.uz/problem/view/BOI18_election
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define el '\n'
#define FNAME ""
#define ll long long
#define int long long
#define ld long double
const int MOD = 1e9 + 7;
const ll INF = 1e18 + 7;
const double EPS = 1e-9;
void setup()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
if (fopen(FNAME ".inp", "r"))
{
freopen(FNAME ".inp", "r", stdin);
freopen(FNAME ".out", "w", stdout);
}
return;
}
int n, q;
string s;
struct Node
{
int pref, suff, sum, ans;
};
struct SegmentTree
{
int n;
vector<Node> nodes;
Node merge(Node a, Node b)
{
Node res;
res.pref = max({a.pref, a.sum + b.pref});
res.suff = max({b.suff, b.sum + a.suff});
res.sum = a.sum + b.sum;
res.ans = max({a.ans + b.sum, a.sum + b.ans, a.pref + b.suff});
return res;
}
void init(int n) { this->n = n, nodes.assign(4 * n + 5, {}); }
void build() { build(1, 1, n); }
void build(int idx, int l, int r)
{
if (l == r)
{
if (s[l] == 'C')
nodes[idx] = {0, 0, -1, 0};
else
nodes[idx] = {1, 1, 1, 1};
return;
}
int m = (l + r) >> 1;
build(idx << 1, l, m);
build((idx << 1) + 1, m + 1, r);
nodes[idx] = merge(nodes[idx << 1], nodes[(idx << 1) + 1]);
}
Node query(int u, int v) { return query(u, v, 1, 1, n); }
Node query(int u, int v, int idx, int l, int r)
{
if (r < u || v < l)
return {0, 0, 0, 0};
if (u <= l && r <= v)
return nodes[idx];
int mid = (l + r) >> 1;
return merge(query(u, v, idx << 1, l, mid),
query(u, v, (idx << 1) + 1, mid + 1, r));
}
};
SegmentTree st;
void solve()
{
cin >> n >> s >> q, s = " " + s;
st.init(n), st.build();
for (int l, r, i = 1; i <= q; ++i)
cin >> l >> r, cout << st.query(l, r).ans << el;
return;
}
signed main()
{
setup();
int t = 1;
bool multiTest = false;
if (multiTest)
cin >> t;
while (t--)
solve();
return 0;
}