/bx
#include <bits/stdc++.h>
using namespace std;
#define sp putchar(' ')
#define en putchar('\n')
#define pb push_back
#define int long long
#define P 998244353
#define HP 1000000000000002097
#define N (int)(5e5+5)
int read(){ char ch=getchar();int x=0,f=1;while(ch>'9' || ch<'0'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f; }
void print(int x){ if(x<0) putchar('-'),x=-x;if(x>9)print(x/10);putchar(x%10+'0'); }
int n,m;
char a[N];
struct Tree{ int o,i,io,oi,ioi; }tr[N*4];
void up(int k)
{
int l=k<<1,r=k<<1|1;
tr[k].i=tr[l].i+tr[r].i;
tr[k].o=tr[l].o+tr[r].o;
tr[k].io=tr[l].io+tr[r].io+tr[l].i*tr[r].o;
tr[k].oi=tr[l].oi+tr[r].oi+tr[l].o*tr[r].i;
tr[k].ioi=tr[l].ioi+tr[r].ioi+tr[l].i*tr[r].oi+tr[l].io*tr[r].i;
}
void build(int k,int l,int r)
{
if(l==r){
if(a[l]=='O') tr[k].o=1;
else tr[k].i=1;
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
up(k);
}
void modify(int k,int l,int r,int ql,int qr,char val)
{
if(l>=ql && r<=qr){
//tr[k].i=tr[k].o=tr[k].io=tr[k].oi=tr[k].ioi=0;
if(val=='O') tr[k].i=0,tr[k].o=1;
else tr[k].o=0,tr[k].i=1;
return;
}
int mid=(l+r)>>1;
if(ql<=mid) modify(k<<1,l,mid,ql,qr,val);
if(qr>mid) modify(k<<1|1,mid+1,r,ql,qr,val);
up(k);
}
Tree query(int k,int l,int r,int ql,int qr)
{
if(l>=ql && r<=qr) return tr[k];
int cnt=0,mid=(l+r)>>1;
Tree trl,trr,tre;
if(ql<=mid) trl=query(k<<1,l,mid,ql,qr);
if(qr>mid) trr=query(k<<1|1,mid+1,r,ql,qr);
if(ql<=mid && qr>mid){
tre.i=trl.i+trr.i;
tre.o=trl.o+trr.o;
tre.io=trl.io+trr.io+trl.i*trr.o;
tre.oi=trl.oi+trr.oi+trl.o*trr.i;
tre.ioi=trl.ioi+trr.ioi+trl.i*trr.oi+trl.io*trr.i;
return tre;
}
else if(ql<=mid) trl;
else return trr;
}
main()
{
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
int op,x,y;
char c;
while(m--){
cin>>op;
if(op==1){
cin>>x>>c;
modify(1,1,n,x,x,c);
}
else{
cin>>x>>y;
cout<<query(1,1,n,x,y).ioi<<"\n";
}
}
return 0;
}