#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
/**
* Segment Tree har bir tugunida 4 ta qiymat saqlaydi:
* sum: jami balans (C=+1, T=-1)
* pref: eng kichik prefiks balans
* suff: eng kichik suffiks balans
* ans: o'chirilishi kerak bo'lgan minimal ovozlar
*/
struct Node {
int sum, pref, suff, ans;
};
// Ikki segmentni birlashtirish funksiyasi
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 mantiq: ans = max(chap_ans + o'ng_sum, o'ng_ans + chap_sum, chap_pref + o'ng_suff)
// Bu formula prefiks va suffiks shartlarini bir vaqtda hisobga oladi
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) {
if (s[start - 1] == 'C') {
// Cap (+1) bo'lsa: pref/suff 0 (minimum kamaymaydi), ans 0
tree[node] = {1, 0, 0, 0};
} else {
// Tony (-1) bo'lsa: pref/suff -1, ans 1 (chunki uni o'chirish kerak)
tree[node] = {-1, -1, -1, 1};
}
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 (l <= start && end <= r) return tree[node];
int mid = (start + end) / 2;
if (r <= mid) return query(2 * node, start, mid, l, r);
if (l > mid) return query(2 * node + 1, mid + 1, end, l, r);
return merge(query(2 * node, start, mid, l, r), query(2 * node + 1, mid + 1, end, l, r));
}
int main() {
// Tezkor kiritish-chiqarish
ios::sync_with_stdio(false);
cin.tie(NULL);
if (!(cin >> N >> s >> Q)) return 0;
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);
// ans - bu o'chirilishi shart bo'lgan minimal ovozlar soni
cout << res.ans << "\n";
}
return 0;
}