Castiel_Cass @ 2020-02-08 09:04:43
#include<bits/stdc++.h>
#define A 10000000
#define N 10001
using namespace std;
bool ans[A|1],query[A|1],poin[N];
struct edge{int to,v,next;}e[N<<1];
int head[N],tot,siz[N],dis[N];
int ques[N],q[N],rem[N],fam[N];
void add(int fr,int to,int v)
{
e[++tot].to=to;
e[tot].v=v;
e[tot].next=head[fr];
head[fr]=tot;
}
void dfssize(int rt,int fa)
{
siz[rt]=1;
for(int i=head[rt];i;i=e[i].next)if(!poin[e[i].to]&&e[i].to!=fa)
dfssize(e[i].to,rt),
siz[rt]+=siz[e[i].to];
}
int getroot(int rt)
{
dfssize(rt,0);
int now=rt;
while(1)
{
int i;
for(i=head[now];i;i=e[i].next)
if(!poin[e[i].to]&&siz[e[i].to]<siz[now]&&siz[e[i].to]>=siz[rt]>>1)
//if(now==1)
{
now=e[i].to;
break;
}
if(i==0)break;
}
return now;
}
void dfsdis(int rt,int fa,int s)
{
rem[++rem[0]]=dis[rt];
fam[rem[0]]=s;
for(int i=head[rt];i;i=e[i].next)
if(e[i].to!=fa&&!poin[e[i].to])
dis[e[i].to]=dis[rt]+e[i].v,
dfsdis(e[i].to,rt,s);
}
int clear[N];
void getans(int rt)
{
ans[0]=1;
dis[rt]=0;rem[0]=0;
for(int i=head[rt];i;i=e[i].next)if(!poin[e[i].to])
dis[e[i].to]=dis[rt]+e[i].v,
dfsdis(e[i].to,rt,i);
for(int i=rem[0];i;i--)
{
if(fam[i]!=fam[i-1])
{
for(;q[0];q[0]--)
ans[q[q[0]]]=1;
}
for(int l=ques[0];l;l--)
if(ques[l]-rem[i]>=0&&ans[ques[l]-rem[i]]==1)query[l]=1;
q[++q[0]]=rem[i];
}
q[0]=0;
for(int i=rem[0];i;i--)ans[rem[i]]=0;
}
void fz(int rt)
{
rt=getroot(rt);
getans(rt);
poin[rt]=1;
for(int i=head[rt];i;i=e[i].next)
if(!poin[e[i].to])
fz(e[i].to);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
add(a,b,v);
add(b,a,v);
}
for(int i=1;i<=m;i++)
{
scanf("%d",&ques[i]);
}
ques[0]=m;
fz(1);
for(int i=1;i<=m;i++)
{
if(query[i]==1)printf("AYE\n");
else printf("NAY\n");
}
return 0;
}