#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define N 200005
#define mod 1000000007
ll suffix[200005]={0},p[N];
ll prefix[200005]={0},inv[N];
string s1,s;
int n;
ll pow(ll x,ll y)
{
if(y==0)
return 1;
ll result=pow(x,y/2)%mod;
result=(result*result)%mod;
if(y&1==1)
result=(result*x)%mod;
return result;
}
void update(ll x,ll value,bool suff)
{
for(;x<N;x+=(x&(-x)))
{
if(suff)
suffix[x]=(suffix[x]+value)%mod;
else
prefix[x]=(prefix[x]+value)%mod;
}
}
ll range(ll x,bool suff)
{
ll count=0;
for(;x>0;x-=(x&(-x)))
{
if(suff)
count=(count + suffix[x])%mod;
else
count=(count + prefix[x])%mod;
}
return count;
}
void hashing()
{
p[0]=1;
inv[0]=1;
ll suff=0,pref=0;
ll val_pre=s[0]-'a'+1;
ll val_suf=s1[0]-'a'+1;
update(1,val_pre,0);
update(1,val_suf,1);
for(int i=1;i<n;i++)
{
p[i]=(p[i-1]*257)%mod;
val_pre=((s[i]-'a'+1)*p[i]+mod)%mod;
val_suf=((s1[i]-'a'+1)*p[i]+mod)%mod;
// cout<<val_pre<<" "<<val_suf<<" ";
inv[i]=pow(p[i],mod-2); // finding modulo inverse
update(i+1,val_pre,0);
update(i+1,val_suf,1);
}
}
void query(int q)
{
while(q--)
{
int a;
cin>>a;
if(a==1)
{
int pos;
char k;
cin>>pos>>k;
ll val_pre=((s[pos-1]-'a'+1)*p[pos-1])%mod;
ll val_suf=((s1[n-pos]-'a'+1)*p[n-pos])%mod;
s1[n-pos]=k;
s[pos-1]=k;
update(pos,-1*val_pre,0);
update(n-pos+1,-1*val_suf,1);
val_pre=((s[pos-1]-'a'+1)*p[pos-1])%mod;
val_suf=((s1[n-pos]-'a'+1)*p[n-pos])%mod;
update(pos,val_pre,0);
update(n-pos+1,val_suf,1);
}
else{
ll l,r;
cin>>l>>r;
ll val1=(((range(r,0)-range(l-1,0))*inv[l])%mod+mod)%mod;
ll val2=(((range(n-l+1,1)-range(n-r,1))*inv[n-r+1])% mod + mod)%mod;
// cout<<s<<" "<<s1<<" "<<val1<<" "<<val2<<" ";
if(val1==val2)
cout<<"YES";
else
cout<<"NO";
cout<<endl;
}
}
}
int main()
{
int q;
cin>>n>>q;
cin>>s;
s1=string(s.rbegin(),s.rend());
//cout<<s1<<" ";
hashing();
query(q);
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBOIDIwMDAwNQojZGVmaW5lIG1vZCAxMDAwMDAwMDA3CmxsIHN1ZmZpeFsyMDAwMDVdPXswfSxwW05dOwpsbCBwcmVmaXhbMjAwMDA1XT17MH0saW52W05dOwpzdHJpbmcgczEsczsKaW50IG47CmxsIHBvdyhsbCB4LGxsIHkpCnsKICAgIGlmKHk9PTApCiAgICAgICAgcmV0dXJuIDE7CiAgICBsbCByZXN1bHQ9cG93KHgseS8yKSVtb2Q7CiAgICByZXN1bHQ9KHJlc3VsdCpyZXN1bHQpJW1vZDsKICAgIGlmKHkmMT09MSkKICAgICAgICByZXN1bHQ9KHJlc3VsdCp4KSVtb2Q7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKfQp2b2lkIHVwZGF0ZShsbCB4LGxsIHZhbHVlLGJvb2wgc3VmZikKewoKICAgIGZvcig7eDxOO3grPSh4JigteCkpKQogICAgIHsKICAgICAgICAgICBpZihzdWZmKQogICAgICAgICAgc3VmZml4W3hdPShzdWZmaXhbeF0rdmFsdWUpJW1vZDsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHByZWZpeFt4XT0ocHJlZml4W3hdK3ZhbHVlKSVtb2Q7CiAgICAgfQoKfQpsbCByYW5nZShsbCB4LGJvb2wgc3VmZikKewpsbCBjb3VudD0wOwogICAgZm9yKDt4PjA7eC09KHgmKC14KSkpCiAgICAgewogICAgICAgICBpZihzdWZmKQogICAgICAgICAgY291bnQ9KGNvdW50ICsgc3VmZml4W3hdKSVtb2Q7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBjb3VudD0oY291bnQgKyBwcmVmaXhbeF0pJW1vZDsKICAgICB9CiAgICAgcmV0dXJuIGNvdW50Owp9CnZvaWQgaGFzaGluZygpCnsKcFswXT0xOwppbnZbMF09MTsKICAgIGxsIHN1ZmY9MCxwcmVmPTA7CiAgICBsbCB2YWxfcHJlPXNbMF0tJ2EnKzE7CiAgICBsbCB2YWxfc3VmPXMxWzBdLSdhJysxOwogICAgdXBkYXRlKDEsdmFsX3ByZSwwKTsKICAgIHVwZGF0ZSgxLHZhbF9zdWYsMSk7CiAgICBmb3IoaW50IGk9MTtpPG47aSsrKQogICAgewogICAgICAgcFtpXT0ocFtpLTFdKjI1NyklbW9kOwogICAgICAgIHZhbF9wcmU9KChzW2ldLSdhJysxKSpwW2ldK21vZCklbW9kOwogICAgICAgIHZhbF9zdWY9KChzMVtpXS0nYScrMSkqcFtpXSttb2QpJW1vZDsKICAgICAvLyAgIGNvdXQ8PHZhbF9wcmU8PCIgIjw8dmFsX3N1Zjw8IiAiOwogICAgICAgIGludltpXT1wb3cocFtpXSxtb2QtMik7ICAgLy8gZmluZGluZyBtb2R1bG8gIGludmVyc2UKICAgICAgICB1cGRhdGUoaSsxLHZhbF9wcmUsMCk7CiAgICB1cGRhdGUoaSsxLHZhbF9zdWYsMSk7CiAgICB9Cn0Kdm9pZCBxdWVyeShpbnQgcSkKewoKICAgIHdoaWxlKHEtLSkKICAgIHsKICAgIGludCBhOwogICAgY2luPj5hOwogICAgaWYoYT09MSkKICAgIHsKICAgICAgICBpbnQgcG9zOwogICAgICAgIGNoYXIgazsKICAgICAgICBjaW4+PnBvcz4+azsKICAgIGxsIHZhbF9wcmU9KChzW3Bvcy0xXS0nYScrMSkqcFtwb3MtMV0pJW1vZDsKICAgIGxsIHZhbF9zdWY9KChzMVtuLXBvc10tJ2EnKzEpKnBbbi1wb3NdKSVtb2Q7CiAgICBzMVtuLXBvc109azsKICAgIHNbcG9zLTFdPWs7CiAgICB1cGRhdGUocG9zLC0xKnZhbF9wcmUsMCk7CiAgICAgdXBkYXRlKG4tcG9zKzEsLTEqdmFsX3N1ZiwxKTsKICAgICAgdmFsX3ByZT0oKHNbcG9zLTFdLSdhJysxKSpwW3Bvcy0xXSklbW9kOwogICAgIHZhbF9zdWY9KChzMVtuLXBvc10tJ2EnKzEpKnBbbi1wb3NdKSVtb2Q7CiAgICAgdXBkYXRlKHBvcyx2YWxfcHJlLDApOwogICAgIHVwZGF0ZShuLXBvcysxLHZhbF9zdWYsMSk7CgogICAgfQogICAgZWxzZXsKICAgICAgICBsbCBsLHI7CiAgICAgICAgY2luPj5sPj5yOwogICAgICAgIGxsIHZhbDE9KCgocmFuZ2UociwwKS1yYW5nZShsLTEsMCkpKmludltsXSklbW9kK21vZCklbW9kOwogICAgICAgICBsbCB2YWwyPSgoKHJhbmdlKG4tbCsxLDEpLXJhbmdlKG4tciwxKSkqaW52W24tcisxXSklIG1vZCArIG1vZCklbW9kOwogLy8gICBjb3V0PDxzPDwiICI8PHMxPDwiICI8PHZhbDE8PCIgIjw8dmFsMjw8IiAiOwogICAgICAgICBpZih2YWwxPT12YWwyKQogICAgICAgICAgICBjb3V0PDwiWUVTIjsKICAgICAgICAgICAgZWxzZQogICAgICAgICBjb3V0PDwiTk8iOwogICAgICAgICBjb3V0PDxlbmRsOwogICAgfQogICAgfQp9CmludCBtYWluKCkKewogICAgaW50IHE7CiAgICBjaW4+Pm4+PnE7CiAgICBjaW4+PnM7CiAgICBzMT1zdHJpbmcocy5yYmVnaW4oKSxzLnJlbmQoKSk7CiAgLy9jb3V0PDxzMTw8IiAiOwogICAgaGFzaGluZygpOwogICAgcXVlcnkocSk7Cgp9Cg==