#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Node {
int sum, pref, suff, ans;
};
Node merge(const Node& a, const Node& b) {
Node res;
res.sum = a.sum + b.sum;
res.pref = min(a.pref, a.sum + b.pref);
res.suff = min(b.suff, b.sum + a.suff);
// Asosiy formula: bekor qilinadigan minimal ovozlar
res.ans = max({a.ans + b.sum, b.ans + a.sum, a.pref + b.suff});
return res;
}
int N, Q;
string s;
vector<Node> tree;
void build(int node, int start, int end) {
if (start == end) {
int val = (s[start - 1] == 'C' ? 1 : -1);
tree[node] = {val, min(0, val), min(0, val), (val == -1 ? 1 : 0)};
return;
}
int mid = (start + end) / 2;
build(2 * node, start, mid);
build(2 * node + 1, mid + 1, end);
tree[node] = merge(tree[2 * node], tree[2 * node + 1]);
}
Node query(int node, int start, int end, int l, int r) {
if (r < start || end < l) return {0, 0, 0, 0};
if (l <= start && end <= r) return tree[node];
int mid = (start + end) / 2;
return merge(query(2 * node, start, mid, l, r), query(2 * node + 1, mid + 1, end, l, r));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> s >> Q;
tree.resize(4 * N + 1);
build(1, 1, N);
while (Q--) {
int L, R;
cin >> L >> R;
Node res = query(1, 1, N, L, R);
cout << res.ans << "\n";
}
return 0;
}