#pragma GCC optimize("Ofast","inline","unroll-loops","no-stack-protector")
#include <bits/stdc++.h>
#define MountainRain main
//#define int long long
//#define double long double
#define INF 0x3f3f3f3f
#define endl '\n'
#define fi first
#define se second
using namespace std;typedef pair<int,int> PII;typedef pair<double,double> PDD;typedef long long LL;typedef unsigned long long ULL;int in(){int x=0,y=0;char c=0;while(!isdigit(c))y|=c=='-',c=getchar();while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();return y?-x:x;}void out(int x){if(x<0)putchar('-'),x=-x;if(x>9)out(x/10);putchar(x%10+'0');}
const int N=200010;
int n,m;
//q[i]表示每个表达式的值是什么
//id[i]表示每个位置属于哪一段
//l[i]表示某一段的左边界是什么,r[i]表示某一段的右边界是什么
//cnt表示当前一共有多少段
int q[N],id[N],l[N],r[N],cnt;
//ones[i]表示前i(段)里有多少个1
//zeroes[i]表示i这个数到i所在那一段的左边界有多少个0
int ones[N],zeroes[N];
void solve()
{
cin>>n>>m;
string s;
for(int i=1;i<=n;++i)
{
cin>>s;
//and用0表示,or用1表示
//问:难道不会和"true" "false"冲突吗?
//答:不会,奇数位置必是布尔值,偶数位置必是运算符
if(s=="true" or s=="or")q[i]=1;
//如果当前位置是(布尔值)的话
if(i&1)
{
//如果它前面是'or' 或者它是第一个数,那么是and段的开头
//为什么我们要想到用and段的开头作为if呢?因为(前缀和的思想需要知道第一个数是几,后面的前缀和由它推过来)
if(i==1 or q[i-1])
{
cnt++;//段数多1
l[cnt]=i,r[cnt-1]=i-2;//这一段的左边界就是i,前一段的右边界就是i-2
//第cnt-1段已经算完,开始第cnt段之前,先维护一下第cnt-1段到开头一共有几个1,
//注意,这里+!zeroes[i-2]并不是真的在算1的个数,我们需要的只是有没有1
//而zeroes[i-2]统计的只是cnt-1那一段的0的个数(其实是有没有0),我们取个反就是有没有1
if(cnt>=2)ones[cnt-1]=ones[cnt-2]+!zeroes[i-2];
zeroes[i]=!q[i];//段内第一个数在段内的前缀和看的是这个数是不是0
}
//前缀和的正常转移,i-1是"and""or"符号,所以我们从i-2转移过来
else zeroes[i]=zeroes[i-2]+!q[i];//我们要算的是0的个数
id[i]=cnt;//表示当前在第cnt段内
}
}
r[cnt]=n;//终点的右边界就是n
ones[cnt]=ones[cnt-1]+!zeroes[n];
//先不看上面,先假设ones[]和zeroes[]全都已经算出来了
while(m--)
{
//从left到right这一个区间可以被替换成true或false
int left,right;cin>>left>>right>>s;
bool res= s=="true";//res表示我们想要的值,想要"true"就是想要1,想要"false"就是想要0
//找到left属于的那一段,right属于的那一段,[left,right]之间的需要被替换,替换之后再和两边的值计算
int lid=id[left],rid=id[right];
//把两头的所有的1的个数统计出来,但凡有1,or起来就都是true
int a=ones[lid-1]+ones[cnt]-ones[rid];
//还剩下lid段没有被[left,right]包围的部分,以及rid段没有被[left,right]包围的部分
//对于这部分,因为是and运算,但凡有0,and起来就都是false
int b=zeroes[r[rid]]-zeroes[right];
if(l[lid]!=left)b+=zeroes[left-2];
//or的过程有1,并且and的过程没有0
if(res==(a or !b and true) or res==(a or !b and false))cout<<"Y";
else cout<<"N";
}
}
signed MountainRain()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cout.setf(ios::fixed),cout.precision(2);
int T=1;//cin>>T;
while(T--)solve();
return 0;
}