#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int) (x).size()
#define endl '\n'
const int N=(1ll<<20);
vector<int> tree[4*N];
int cnt=0;
int query(int l, int r, int ql, int qr, int v) {
if(l>qr||r<ql) return 0;
if(ql<=l&&r<=qr) return lower_bound(all(tree[v]), cnt)-tree[v].begin();
int mid=(l+r)/2;
return query(l, mid, ql, qr, 2*v)+query(mid+1, r, ql, qr, 2*v+1);
}
int main()
{
cin.tie(0) -> sync_with_stdio(0);
int n, q;
cin >> n >> q;
string ca;
cin >> ca;
bool a[n];
vector<int> s[4];
int nxt[n+1]={};
for(int i = 0;i <= n;i++) nxt[i]=-1;
for(int i = 0;i < n;i++)
{
a[i]=(ca[i]=='P');
s[a[i]].pb(i);
if(sz(s[a[i]^1])) nxt[i]=s[a[i]^1].back(), s[a[i]^1].pop_back();
tree[i+N].pb(nxt[i]);
}
for(int i=N-1;i>=1;i--) {
merge(all(tree[2*i]), all(tree[2*i+1]), back_inserter(tree[i]));
}
vector<array<int, 3>> quer;
for(int i=0;i<q;i++) {
int l, r;
cin >> l >> r;
l--, r--;
cnt=l;
int ans=query(0, N-1, l, r, 1);
// for(int i=l;i<=r;i++) ans=query(0, N-1, l, i, 1);
cout << ans << endl;
}
// for(int i = 2;i < n;i++) cout << nxt[i] << " ";
}