#include<bits/stdc++.h>
using namespace std;
#define lc u<<1
#define rc u<<1|1
struct node
{
int l,r,p,sum,lazy;
}t[800010];
int a[200010];
void build(int u,int l,int r)
{
t[u].l=l;
t[u].r=r;
if(l==r)
{
t[u].p=a[l];
t[u].sum=a[r]-a[l-1];
return;
}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
t[u].sum=t[lc].sum+t[rc].sum;
t[u].p=min(t[lc].p,t[rc].p);
return;
}
void push_down(int u)
{
t[u].sum+=(t[u].r-t[u].l+1)*t[u].lazy;
t[u].p+=t[u].lazy;
t[lc].lazy+=t[u].lazy;
t[rc].lazy+=t[u].lazy;
t[u].lazy=0;
}
int find1(int u,int i)
{
push_down(u);
if(t[u].l==t[u].r && t[u].l==i)
{
return t[u].p;
}
int mid=(t[u].l+t[u].r)>>1;
if(i<=mid)
{
return find1(lc,i);
}
else
{
return find1(rc,i);
}
}
void update(int u,int l,int r,int x)
{
if(t[u].l>=l && t[u].r<=r)
{
t[u].sum+=(t[u].r-t[u].l+1)*x;
t[u].lazy+=x;
t[u].p+=x;
return;
}
push_down(u);
int mid=(t[u].l+t[u].r)>>1;
if(l<=mid)
{
update(lc,l,mid,x);
}
if(r>mid)
{
update(rc,mid+1,r,x);
}
t[u].sum=t[lc].sum+t[rc].sum;
t[u].p=min(t[lc].p,t[rc].p);
}
node find(int u,int l,int r)
{
push_down(u);
if(t[u].l>=l && t[u].r<=r)
{
return t[u];
}
int mid=(t[u].l+t[u].r)>>1;
node ls,rs;
bool x=0,y=0;
if(l<=mid)
{
x=1;
ls=find(lc,l,mid);
}
if(r>mid)
{
y=1;
rs=find(rc,mid+1,r);
}
if(x&&y)
{
node ans;
ans.p=min(ls.p,rs.p);
ans.sum=ls.sum+rs.sum;
return ans;
}
if(x)
{
return ls;
}
return rs;
}
int main()
{
int n,m;
cin>>n>>m;
string s;
cin>>s;
for(int i=0;i<n;i++)
{
a[i+1]=a[i];
if(s[i]=='(')
{
a[i+1]++;
}
else
{
a[i+1]--;
}
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int op,u,v;
cin>>op>>u>>v;
if(op==1)
{
swap(s[u-1],s[v-1]);
if(s[u-1]!=s[v-1])
{
if(s[u-1]=='(')
{
update(1,u,v-1,2);
update(1,v,n,-2);
}
else
{
update(1,u,v-1,-2);
update(1,v,n,2);
}
}
}
else
{
node ans=find(1,u,v);
if(u!=1)
{
if(ans.sum==0 && ans.p-find1(1,u-1)>=0 )
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
else
{
if(ans.sum==0 && ans.p>=0 )
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
}
}
}