//
// main.cpp
// IntensiveCamp 1 2026
//
// Created by Ali AlSalman on 27/04/2026.
//
#include <bits/stdc++.h>
//#define INTERACTIVE
//#define TESTCASES
//#define FUNCTIONAL
//#define SPOJ_BULLSCHEI__SZ__E__KIJETESANPAKALU__
#ifndef INTERACTIVE
#define endl '\n'
#endif
template<typename T>
using vec = std::vector<T>;
using namespace std;
#define all(x) x.begin(), x.end()
struct mst {
int offset;
vec<vec<int>> data;
mst(vec<int> &arr) : offset(1<<(32 - __builtin_clz((int) arr.size() - 1))), data(2 * offset) {
for (int i = 0; i < arr.size(); i++)
data[i + offset] = {arr[i]};
for (int i = offset - 1; i; i--)
merge(all(data[2 * i]), all(data[2 * i + 1]), back_inserter(data[i]));
}
int _q(int v, int l, int r, int ql, int qr, int x) {
if (ql <= l && r <= qr) return (int) distance(data[v].begin(), lower_bound(all(data[v]), x));
else if (r <= ql || qr <= l) return 0;
else {
int m = (l + r) / 2;
return _q(2 * v, l, m, ql, qr, x) + _q(2 * v + 1, m, r, ql, qr, x);
}
}
int q(int l, int r, int x) {
return _q(1, offset, 2 * offset, l + offset, r + offset + 1, x);
}
};
void solve() {
int n, q;
string s;
cin>>n>>q>>s;
vec<int> c[2];
vec<int> opt(n, -1);
for (int i = 0; i < n; i++) {
bool color = s[i] == 'P';
if (!c[!color].empty()) {
opt[i] = c[!color].back();
c[!color].pop_back();
}
c[color].push_back(i);
}
mst tree(opt);
while (q--) {
int l, r;
cin>>l>>r; l--; r--;
cout<<tree.q(l, r, l)<<endl;
}
}
#ifndef FUNCTIONAL
int main() {
#ifndef INTERACTIVE
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
#endif
int t = 1;
#ifdef TESTCASES
cin>>t;
#endif
for (int i = t; i--;) {
#if defined(TESTCASES) && defined(SPOJ_BULLSCHEI__SZ__E__KIJETESANPAKALU__)
cout<<"Case "<<t-i<<":\n";
#elif defined(SPOJ_BULLSCHEI__SZ__E__KIJETESANPAKALU__)
#warning SPOJ_BULLSCHEIßE__KIJETESANPAKALU__ without TESTCASES doesn't ducking make sense!
#endif
solve();
}
return 0;
}
#endif