#include <bits/stdc++.h>
#define V vector
#define L(i,j,k) for(int i=(j);i<=(k);i++)
#define R(i,j,k) for(int i=(j);i>=(k);i--)
#define all(x) x.begin(),x.end()
#define sz(a) ((int)a.size())
#define pb push_back
using namespace std;
typedef long long ll;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template<typename T>
using indexed_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
const int N=1e5+5;
int n;
string str;
struct Node{
int d[2][2];
Node(){
L(i,0,1)L(j,0,1)d[i][j]=0;
}
} st[N*4];
Node mrg(Node a,Node b){
Node c;
L(i,0,1){
L(j,0,1){
L(k,0,1){
L(l,0,1){
if(j==k)continue;
int carry=min(a.d[i][j],b.d[k][l]);
c.d[i][l]+=carry;
a.d[i][j]-=carry;
b.d[k][l]-=carry;
}
}
}
}
L(i,0,1)L(j,0,1){
if(a.d[i][j])c.d[i][j]+=a.d[i][j];
if(b.d[i][j])c.d[i][j]+=b.d[i][j];
}
return c;
}
void build(int v=1,int s=0,int e=n-1){
if(s==e){
int ch=(str[s]=='P');
st[v].d[ch][ch]=1;
return;
}
int m=(s+e)/2;
build(v*2,s,m),build(v*2+1,m+1,e);
st[v]=mrg(st[v*2],st[v*2+1]);
}
Node que(int ts,int te,int v=1,int s=0,int e=n-1){
if(e<ts||s>te)return Node();
if(ts<=s&&e<=te){
return st[v];
}
int m=(s+e)/2;
return mrg(que(ts,te,v*2,s,m),que(ts,te,v*2+1,m+1,e));
}
int main(){
int q;cin>>n>>q;
cin>>str;
build();
L(i,0,q-1){
int l,r;cin>>l>>r;l--;r--;
Node ret=que(l,r);
int towers=0;
L(i,0,1)L(j,0,1)towers+=ret.d[i][j];
cout<<towers<<endl;
}
}