马蜂清奇 轻点喷(
using namespace std;
constexpr int INF = 1e8;
constexpr float EPS = 1e-3;
vector<int> type, dep, siz, fa;
vector<int> dfn, rnk;
vector<int> htop, hson;
vector<vector<int>> edges;
void dfs1(int u) {
siz[u] = 1;
int ssiz = -1;
hson[u] = -1;
for (int v : edges[u]) {
if (v == fa[u])
continue;
dep[v] = dep[u] + 1;
fa[v] = u;
dfs1(v);
siz[u] += siz[v];
if (ssiz < siz[v]) {
ssiz = siz[v];
hson[u] = v;
}
}
}
int cnt = 0;
void dfs2(int u) {
rnk[cnt] = u;
dfn[u] = cnt++;
for (int v : edges[u]) {
if (v == fa[u])
continue;
if (v == hson[u]) htop[v] = htop[u];
else htop[v] = v;
dfs2(v);
}
}
void build(int n, int rt) {
dep.resize(n);
siz.resize(n);
fa.resize(n);
dfn .resize(n);
rnk.resize(n);
htop.resize(n);
hson.resize(n);
fa[rt] = -1;
dep[rt] = 0;
dfs1(rt);
htop[rt] = rt;
dfs2(rt);
}
map<int, vector<int>> mp;
inline bool qsearch(int a, int b, int c) { //[)
int l = 0, r = mp[c].size();
while (l != r) {
int m = l + r >> 1;
if (mp[c][m] >= b)
r = m;
else if (mp[c][m] < a)
l = m + 1;
else
return true;
}
return false;
}
int main() {
// freopen("milkvisits.in", "r", stdin);
// freopen("milkvisits.out", "w", stdout);
int n, m;
cin >> n >> m;
type.resize(n);
edges.resize(n);
for (int i = 0; i < n; i++)
cin >> type[i];
for (int i = 0, u, v; i < n - 1; i++) {
cin >> u >> v;
--u, --v;
edges[u].push_back(v);
edges[v].push_back(u);
}
int rt = 0;
build(n, rt);
for (int i = 0; i < n; i++)
mp[type[i]].push_back(dfn[i]);
for (auto& t : mp)
sort(t.second.begin(), t.second.end());
while (m--) {
int u, v, c;
cin >> u >> v >> c;
--u, --v;
bool d = false;
while (htop[u] != htop[v] && !d) {
if (dep[htop[u]] < dep[htop[v]])
swap(u, v);
d |= qsearch(dfn[htop[u]], dfn[u] + 1, c);
u = fa[htop[u]];
}
if (dep[u] < dep[v])
swap(u, v);
d |= qsearch(dfn[v], dfn[u] + 1, c);
cout << d;
}
cout << endl;
return 0;
}