RT

code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,q;
int a[N],dep[N],dis2[N],dis5[N];
int dp[N][30];
struct node{
int y,z;
};
vector<node>v[N];
int Cal(int x,int num){
int cnt=0;
while(x&&x%num==0){
x/=num;
cnt++;
}
return cnt;
}
void DFS(int x,int fa){
dep[x]=dep[fa]+1;
dp[x][0]=fa;
for(int i=1;(1<<i)<=dep[x];i++)
dp[x][i]=dp[dp[x][i-1]][i-1];
for(int i=0;i<v[x].size();i++){
int to=v[x][i].y,w=v[x][i].z;
if(to==fa)
continue;
if(w==0)
dis2[to]=dis5[to]=1e9;
else{
dis2[to]=dis2[x]+Cal(w,2)-4;
dis5[to]=dis5[x]+Cal(w,5)-4;
}
DFS(to,x);
}
return;
}
int LCA(int x,int y){
if(dep[x]>dep[y])
swap(x,y);
for(int i=20;i>=0;i--)
if(dep[x]<=dep[dp[y][i]])
y=dp[y][i];
if(x==y)
return x;
for(int i=20;i>=0;i--)
if(dp[x][i]!=dp[y][i])
x=dp[x][i],y=dp[y][i];
return dp[x][0];
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++){
int x,y;
double z;
cin>>x>>y>>z;
z*=10000;
v[x].push_back({y,z});
v[y].push_back({x,z});
}
DFS(1,0);
while(q--){
int x,y;
cin>>x>>y;
int num2=dis2[x]+dis2[y]-2*dis2[LCA(x,y)]+Cal(a[x],2);
int num5=dis5[x]+dis5[y]-2*dis5[LCA(x,y)]+Cal(a[x],5);
if(min(num2,num5)>=0||!a[x])
cout<<"Yes\n";
else
cout<<"No\n";
}
return 0;
}