#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 64;
int n,q;
long long m,kuan=1,gao=1,a,b,upas,allas,nowk,nowg;
char s[N];
/*
一道心细大模拟
首先,看数据范围,T<=10000,n<=60,直接考虑对于每个询问都去模拟
注意,心平气和,冷静推断是第一
*/
int main()
{
scanf("%d%lld%d",&n,&m,&q);
scanf("%s",s+1);
for(int i=1;i<=n;i++){
/*
首先跑一边预处理,因为要先构建出折痕网格
*/
if(s[i]=='u' || s[i]=='d') gao*=2;//预处理
else kuan*=2;
}
while(q--){
scanf("%lld%lld",&a,&b);a++,b++;
upas=1;allas=1;
//upas:比这层高的 allas:一共多高
nowk=kuan;nowg=gao;
//从上往下,从左往右,依次编号
for(int i=1;i<=n;i++){
if(s[i]=='u'){
nowg>>=1;
if(a<=nowg) upas+=allas;
else a=nowg*2-a+1,upas=allas-upas+1;
/*
如果上翻:首先网格的高/2
然后,判断目标格子的位置
如果比翻着过后的位置靠下
就要把它翻上去 :a=nowg*2-a+1,
翻上去过后他上面的就等于原本在它下面的+1(算上自己)
就等于所有的-原本上面的+1
如果靠上,那么位置不会改变,但是要一整个加上all
*/
}
if(s[i]=='d'){
nowg>>=1;
if(a>nowg) a-=nowg,upas+=allas;
else a=nowg-a+1,upas=allas-upas+1;
/*
下翻同理
如果比翻下去的位置要小,就把他翻下去,然后上面的上下颠倒
否则更改相对位置,加上上半部分一整个
*/
}
if(s[i]=='r'){
nowk>>=1;
if(b>nowk) b-=nowk,upas+=allas;
else b=nowk-b+1,upas=allas-upas+1;
/*
左右翻同理
*/
}
if(s[i]=='l'){
nowk>>=1;
if(b>nowk) b=nowk*2-b+1,upas=allas-upas+1;
else upas+=allas;
}
allas<<=1;
}
if(upas<=m) printf("yes\n");
else printf("no\n");
}
return 0;
}