rt,code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,M=15;
struct node
{
bool H,G;
int fa;
}f[N][M];
char a[N],w;
int n,m,u,v,deep[N],Log[N];
vector<int>edge[N];
void build(int u,int v)
{
edge[u].push_back(v);
edge[v].push_back(u);
}
void init(int u,int fa)
{
f[u][0].fa=fa,deep[u]=deep[fa]+1;
if(a[u]=='H'||a[fa]=='H')f[u][0].H=true;
if(a[u]=='G'||a[fa]=='G')f[u][0].G=true;
for(int i=1;i<=Log[n];i++)
{
f[u][i].H=f[u][i-1].H|f[f[u][i-1].fa][i-1].H;
f[u][i].G=f[u][i-1].G|f[f[u][i-1].fa][i-1].G;
f[u][i].fa=f[f[u][i-1].fa][i-1].fa;
}
for(auto v:edge[u])
if(v!=fa)init(v,u);
}
bool find(int x,int y,char z)
{
if(x==y)
{
if(z=='H')
{
if(a[x]=='H')return true;
return false;
}
if(a[x]=='G')return true;
return false;
}
bool H=false,G=false;
if(deep[x]<deep[y])swap(x,y);
for(int i=Log[n];i>=0;i--)
{
if(deep[f[x][i].fa]>=deep[y])
{
H|=f[x][i].H,G|=f[x][i].G;
x=f[x][i].fa;
}
}
if(x==y)
{
if(z=='H')return H;
return G;
}
for(int i=Log[n];i>=0;i--)
{
if(f[x][i].fa!=f[y][i].fa)
{
H|=f[x][i].H|f[y][i].H;
G|=f[x][i].G|f[y][i].G;
x=f[x][i].fa,y=f[y][i].fa;
}
}
H|=f[x][0].H|f[y][0].H;
G|=f[x][0].G|f[y][0].G;
if(z=='H')return H;
else return G;
}
signed main()
{
Log[0]=-1;
cin>>n>>m;
for(int i=1;i<=n;i++)Log[i]=Log[i/2]+1;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++)
cin>>u>>v,build(u,v);
init(1,0);
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
if(find(u,v,w))cout<<1;
else cout<<0;
}
return 0;
}