#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int N=1e6+5,mod=1e9+7;
ll base=31,pw[N+1],inv[N+1];
ll powmod(ll a,ll b,ll m)
{
ll ans=1;
while(b>0)
{
if(b&1)
{
ans=(ans*a)%m;
}
a=(a*a)%m;
b>>=1;
}
return ans;
}
int add(int a,int b)
{
return((a%mod)+(b%mod))%mod;
}
int mul(int a,int b)
{
return((a%mod)*(b%mod))%mod;
}
void init()
{
pw[0]=inv[0]=1;
int temp1=powmod(base,mod-2,mod);
for(int i=1;i<N;i++)
{
pw[i]=(base*pw[i-1])%mod;
inv[i]=(inv[i-1]*temp1)%mod;
}
}
std::mt19937_64 rnd(std::chrono::system_clock::now().time_since_epoch().count());
struct Treap{
struct Node{
int val,h=0;
int pri=rnd(),sz=1;
array<Node*,2>c={0,0};
Node(){}
Node(int k){
val=h=k;
}
};
Node*root=0;
int getSize(Node*t)
{
return t?t->sz:0;
}
int getHash(Node*t)
{
return t?t->h:0;
}
Treap(string&s)
{
for(int i=0;i<s.size();i++)
{
root=merge(root,new Node(s[i]-'a'+1));
// cout<<root->h<<'\n';
}
// print(root);
}
Node*fix(Node*t)
{
t->sz=getSize(t->c[0])+getSize(t->c[1])+1;
int x=mul(getHash(t->c[0]),pw[1]);
x=add(x,t->val);
x=mul(x,pw[getSize(t->c[1])]);
x=add(x,getHash(t->c[1]));
t->h=x;
// t->h=(((getHash(t->c[0])*base+t->val)%mod)*pw[getSize(t->c[1])]+getHash(t->c[1]))%mod;
return t;
}
array<Node*,2>split(Node*t,int k)
{
if(!t) return {0,0};
if(getSize(t->c[0])>=k)
{
auto ret=split(t->c[0],k);
t->c[0]=ret[1];
return {ret[0],fix(t)};
}
else
{
auto ret=split(t->c[1],k-getSize(t->c[0])-1);
t->c[1]=ret[0];
return {fix(t),ret[1]};
}
}
Node*merge(Node*u,Node*v)
{
if(!u||!v) return u?u:v;
if(u->pri>v->pri)
{
u->c[1]=merge(u->c[1],v);
return fix(u);
}
else
{
v->c[0]=merge(u,v->c[0]);
return fix(v);
}
}
void deleteRange(int l,int r)
{
auto a=split(root,l-1);
auto b=split(a[1],r-l+1);
root=merge(a[0],b[1]);
}
int getHash(int l,int r)
{
auto a=split(root,l-1);
auto b=split(a[1],r-l+1);
int ret=b[0]->h;
root=merge(a[0],merge(b[0],b[1]));
return ret;
}
void addChar(int pos,char c)
{
auto a=split(root,pos-1);
root=merge(merge(a[0],new Node(c-'a'+1)),a[1]);
}
void print(Node*t)
{
if(!t) return;
print(t->c[0]);
cout<<t->h<<' ';
print(t->c[1]);
}
};
int rev(int i,int n)
{
return n-i+1;
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
init();
int n,q;cin>>n>>q;
string s;cin>>s;
string f=s;
reverse(f.begin(),f.end());
Treap a(s),b(f);
while(q--)
{
int op;cin>>op;
if(op==1)
{
int l,r;cin>>l>>r;
int l2=rev(l,n),r2=rev(r,n);
n-=(r-l+1);
a.deleteRange(l,r);
b.deleteRange(r2,l2);
}
else if(op==2)
{
int pos;char c;cin>>c>>pos;
a.addChar(pos,c);
b.addChar(rev(pos,n),c);
n++;
}
else
{
int l,r;cin>>l>>r;
int l2=rev(l,n),r2=rev(r,n);
// cout<<a.getHash(l,r)<<' '<<b.getHash(r2,l2)<<'\n';
if(a.getHash(l,r)==b.getHash(r2,l2))
{
cout<<"yes\n";
}
else
{
cout<<"no\n";
}
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBpbnQgbG9uZyBsb25nCmNvbnN0IGludCBOPTFlNis1LG1vZD0xZTkrNzsKbGwgYmFzZT0zMSxwd1tOKzFdLGludltOKzFdOwpsbCBwb3dtb2QobGwgYSxsbCBiLGxsIG0pCnsKICAgIGxsIGFucz0xOwogICAgd2hpbGUoYj4wKQogICAgewogICAgICAgIGlmKGImMSkKICAgICAgICB7CiAgICAgICAgICAgIGFucz0oYW5zKmEpJW07CiAgICAgICAgfQogICAgICAgIGE9KGEqYSklbTsKICAgICAgICBiPj49MTsKICAgIH0KICAgIHJldHVybiBhbnM7Cn0KaW50IGFkZChpbnQgYSxpbnQgYikKewogICAgcmV0dXJuKChhJW1vZCkrKGIlbW9kKSklbW9kOwp9CmludCBtdWwoaW50IGEsaW50IGIpCnsKICAgIHJldHVybigoYSVtb2QpKihiJW1vZCkpJW1vZDsKfQp2b2lkIGluaXQoKQp7CiAgICBwd1swXT1pbnZbMF09MTsKICAgIGludCB0ZW1wMT1wb3dtb2QoYmFzZSxtb2QtMixtb2QpOwogICAgZm9yKGludCBpPTE7aTxOO2krKykKICAgIHsKICAgICAgICBwd1tpXT0oYmFzZSpwd1tpLTFdKSVtb2Q7CiAgICAgICAgaW52W2ldPShpbnZbaS0xXSp0ZW1wMSklbW9kOwogICAgfQp9CnN0ZDo6bXQxOTkzN182NCBybmQoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwpzdHJ1Y3QgVHJlYXB7CiAgICBzdHJ1Y3QgTm9kZXsKICAgICAgICBpbnQgdmFsLGg9MDsKICAgICAgICBpbnQgcHJpPXJuZCgpLHN6PTE7CiAgICAgICAgYXJyYXk8Tm9kZSosMj5jPXswLDB9OwogICAgICAgIE5vZGUoKXt9CiAgICAgICAgTm9kZShpbnQgayl7CiAgICAgICAgICAgIHZhbD1oPWs7CiAgICAgICAgfQogICAgfTsKICAgIE5vZGUqcm9vdD0wOwogICAgaW50IGdldFNpemUoTm9kZSp0KQogICAgewogICAgICAgIHJldHVybiB0P3QtPnN6OjA7CiAgICB9CiAgICBpbnQgZ2V0SGFzaChOb2RlKnQpCiAgICB7CiAgICAgICAgcmV0dXJuIHQ/dC0+aDowOwogICAgfQogICAgVHJlYXAoc3RyaW5nJnMpCiAgICB7CiAgICAgICAgZm9yKGludCBpPTA7aTxzLnNpemUoKTtpKyspCiAgICAgICAgewogICAgICAgICAgICByb290PW1lcmdlKHJvb3QsbmV3IE5vZGUoc1tpXS0nYScrMSkpOwovLyAgICAgICAgICAgIGNvdXQ8PHJvb3QtPmg8PCdcbic7CiAgICAgICAgfQovLyAgICAgICAgcHJpbnQocm9vdCk7CiAgICB9CiAgICBOb2RlKmZpeChOb2RlKnQpCiAgICB7CiAgICAgICAgdC0+c3o9Z2V0U2l6ZSh0LT5jWzBdKStnZXRTaXplKHQtPmNbMV0pKzE7CiAgICAgICAgaW50IHg9bXVsKGdldEhhc2godC0+Y1swXSkscHdbMV0pOwogICAgICAgIHg9YWRkKHgsdC0+dmFsKTsKICAgICAgICB4PW11bCh4LHB3W2dldFNpemUodC0+Y1sxXSldKTsKICAgICAgICB4PWFkZCh4LGdldEhhc2godC0+Y1sxXSkpOwogICAgICAgIHQtPmg9eDsKLy8gICAgICAgIHQtPmg9KCgoZ2V0SGFzaCh0LT5jWzBdKSpiYXNlK3QtPnZhbCklbW9kKSpwd1tnZXRTaXplKHQtPmNbMV0pXStnZXRIYXNoKHQtPmNbMV0pKSVtb2Q7CiAgICAgICAgcmV0dXJuIHQ7CiAgICB9CiAgICBhcnJheTxOb2RlKiwyPnNwbGl0KE5vZGUqdCxpbnQgaykKICAgIHsKICAgICAgICBpZighdCkgcmV0dXJuIHswLDB9OwogICAgICAgIGlmKGdldFNpemUodC0+Y1swXSk+PWspCiAgICAgICAgewogICAgICAgICAgICBhdXRvIHJldD1zcGxpdCh0LT5jWzBdLGspOwogICAgICAgICAgICB0LT5jWzBdPXJldFsxXTsKICAgICAgICAgICAgcmV0dXJuIHtyZXRbMF0sZml4KHQpfTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYXV0byByZXQ9c3BsaXQodC0+Y1sxXSxrLWdldFNpemUodC0+Y1swXSktMSk7CiAgICAgICAgICAgIHQtPmNbMV09cmV0WzBdOwogICAgICAgICAgICByZXR1cm4ge2ZpeCh0KSxyZXRbMV19OwogICAgICAgIH0KICAgIH0KICAgIE5vZGUqbWVyZ2UoTm9kZSp1LE5vZGUqdikKICAgIHsKICAgICAgICBpZighdXx8IXYpIHJldHVybiB1P3U6djsKICAgICAgICBpZih1LT5wcmk+di0+cHJpKQogICAgICAgIHsKICAgICAgICAgICAgdS0+Y1sxXT1tZXJnZSh1LT5jWzFdLHYpOwogICAgICAgICAgICByZXR1cm4gZml4KHUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2LT5jWzBdPW1lcmdlKHUsdi0+Y1swXSk7CiAgICAgICAgICAgIHJldHVybiBmaXgodik7CiAgICAgICAgfQogICAgfQogICAgdm9pZCBkZWxldGVSYW5nZShpbnQgbCxpbnQgcikKICAgIHsKICAgICAgICBhdXRvIGE9c3BsaXQocm9vdCxsLTEpOwogICAgICAgIGF1dG8gYj1zcGxpdChhWzFdLHItbCsxKTsKICAgICAgICByb290PW1lcmdlKGFbMF0sYlsxXSk7CiAgICB9CiAgICBpbnQgZ2V0SGFzaChpbnQgbCxpbnQgcikKICAgIHsKICAgICAgICBhdXRvIGE9c3BsaXQocm9vdCxsLTEpOwogICAgICAgIGF1dG8gYj1zcGxpdChhWzFdLHItbCsxKTsKICAgICAgICBpbnQgcmV0PWJbMF0tPmg7CiAgICAgICAgcm9vdD1tZXJnZShhWzBdLG1lcmdlKGJbMF0sYlsxXSkpOwogICAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICB2b2lkIGFkZENoYXIoaW50IHBvcyxjaGFyIGMpCiAgICB7CiAgICAgICAgYXV0byBhPXNwbGl0KHJvb3QscG9zLTEpOwogICAgICAgIHJvb3Q9bWVyZ2UobWVyZ2UoYVswXSxuZXcgTm9kZShjLSdhJysxKSksYVsxXSk7CiAgICB9CiAgICB2b2lkIHByaW50KE5vZGUqdCkKICAgIHsKICAgICAgICBpZighdCkgcmV0dXJuOwogICAgICAgIHByaW50KHQtPmNbMF0pOwogICAgICAgIGNvdXQ8PHQtPmg8PCcgJzsKICAgICAgICBwcmludCh0LT5jWzFdKTsKICAgIH0KfTsKaW50IHJldihpbnQgaSxpbnQgbikKewogICAgcmV0dXJuIG4taSsxOwp9CnNpZ25lZCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApOwogICAgaW5pdCgpOwogICAgaW50IG4scTtjaW4+Pm4+PnE7CiAgICBzdHJpbmcgcztjaW4+PnM7CiAgICBzdHJpbmcgZj1zOwogICAgcmV2ZXJzZShmLmJlZ2luKCksZi5lbmQoKSk7CiAgICBUcmVhcCBhKHMpLGIoZik7CiAgICB3aGlsZShxLS0pCiAgICB7CiAgICAgICAgaW50IG9wO2Npbj4+b3A7CiAgICAgICAgaWYob3A9PTEpCiAgICAgICAgewogICAgICAgICAgICBpbnQgbCxyO2Npbj4+bD4+cjsKICAgICAgICAgICAgaW50IGwyPXJldihsLG4pLHIyPXJldihyLG4pOwogICAgICAgICAgICBuLT0oci1sKzEpOwogICAgICAgICAgICBhLmRlbGV0ZVJhbmdlKGwscik7CiAgICAgICAgICAgIGIuZGVsZXRlUmFuZ2UocjIsbDIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKG9wPT0yKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHBvcztjaGFyIGM7Y2luPj5jPj5wb3M7CiAgICAgICAgICAgIGEuYWRkQ2hhcihwb3MsYyk7CiAgICAgICAgICAgIGIuYWRkQ2hhcihyZXYocG9zLG4pLGMpOwogICAgICAgICAgICBuKys7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGludCBsLHI7Y2luPj5sPj5yOwogICAgICAgICAgICBpbnQgbDI9cmV2KGwsbikscjI9cmV2KHIsbik7Ci8vICAgICAgICAgICAgY291dDw8YS5nZXRIYXNoKGwscik8PCcgJzw8Yi5nZXRIYXNoKHIyLGwyKTw8J1xuJzsKICAgICAgICAgICAgaWYoYS5nZXRIYXNoKGwscik9PWIuZ2V0SGFzaChyMixsMikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvdXQ8PCJ5ZXNcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb3V0PDwibm9cbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQ==