#include <bits/stdc++.h>
#define ll long long
#define db double
#define vi vector<int>
#define pb push_back
#define For(i, j, k) for (int i = j; i <= k; ++ i)
#define Rof(i, j, k) for (int i = j; i >= k; -- i)
using namespace std;
const int N = 1e4 + 10, M = 110, N1 = 1e7 + 10;
struct edge {
int v, w;
};
int n, m, q[N], p[N], qry[M];
bool st[N], qa[M], st1[N1];
vector<edge> g[N];
int get_siz(int u, int fa) {
if (st[u]) {
return 0;
}
int ret = 1;
for (auto [v, w] : g[u]) {
if (v == fa) {
continue;
}
ret += get_siz(v, u);
}
return ret;
}
int get_c(int u, int fa, int siz, int &w) {
if (st[u]) {
return 0;
}
int s = 1, maxn = 0;
for (auto [v, w] : g[u]) {
if (v == fa) {
continue;
}
int t = get_c(v, u, siz, w);
maxn = max(maxn, t);
s += t;
}
maxn = max(maxn, siz - s);
if (maxn <= n / 2) {
w = u;
}
return s;
}
void get_dist(int u, int fa, int dis, int &qt) {
if (st[u]) {
return ;
}
q[++ qt] = dis;
for (auto [v, w] : g[u]) {
if (v == fa) {
continue;
}
get_dist(v, u, dis + w, qt);
}
}
void calc(int u) {
if (st[u]) {
return ;
}
get_c(u, -1, get_siz(u, -1), u);
// cout << u << '\n';
st[u] = true;
int pt = 0;
st1[0] = true;
for (auto [v, w] : g[u]) {
int qt = 1;
q[qt] = w;
get_dist(v, -1, w, qt);
For (i, 1, qt) {
// cout << q[i] << ',';
For (j, 1, m) {
if (qry[j] >= q[i]) {
qa[j] |= st1[qry[j] - q[i]];
}
}
}
For (i, 1, qt) {
p[ ++ pt] = q[i];
st1[q[i]] = true;
}
}
For (i, 1, pt) {
st1[p[i]] = false;
}
for (auto [v, w] : g[u]) {
calc(v);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
cin >> n >> m;
For (i, 1, n - 1) {
int u, v, w;
cin >> u >> v >> w;
g[u].pb({v, w}), g[v].pb({u, w});
}
For (i, 1, m) {
cin >> qry[i];
}
calc(1);
For (i, 1, m) {
cout << (qa[i] ? "AYE" : "NAY") << '\n';
}
return 0;
}
求助QwQ