WA #3#4#7#10#11#23#24#25 谢谢
#include<bits/stdc++.h>
#define int long long
#define INF 1000000000000000001
using namespace std;
int n,m,p[100001];
vector<int> e[100001];
void read() {
string str;
cin>>n>>m>>str;
for(int i=1; i<=n; ++i) {
cin>>p[i];
}
for(int i=1; i<=n-1; ++i) {
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
}
int f[100001][2],g[100001][2],an[100001][22],h[100001][22][2][2],dep[100001];
void dfs1(int x,int fa) {
dep[x]=dep[fa]+1;
f[x][0]=0,f[x][1]=p[x];
for(int i=0; i<e[x].size(); ++i) {
int y=e[x][i];
if(y==fa)continue;
dfs1(y,x);
f[x][0]+=f[y][1],f[x][1]+=min(f[y][0],f[y][1]);
}
}
void dfs2(int x,int fa) {
for(int i=0; i<e[x].size(); ++i) {
int y=e[x][i];
if(y==fa)continue;
an[y][0]=x;
g[y][0]=g[x][1]+f[x][1]-min(f[y][0],f[y][1]);
g[y][1]=min(g[x][0]+f[x][0]-f[y][1],g[y][0]);
dfs2(y,x);
}
}
void dp() {
for(int i=1; i<=n; ++i) {
h[i][0][0][0]=INF;
h[i][0][0][1]=f[an[i][0]][1]-min(f[i][0],f[i][1]);
h[i][0][1][0]=f[an[i][0]][0]-f[i][1];
h[i][0][1][1]=f[an[i][0]][1]-min(f[i][0],f[i][1]);
}
for(int j=1; j<=21; ++j) {
for(int i=1; i<=n; ++i) {
an[i][j]=an[an[i][j-1]][j-1];
for(int k1=0; k1<=1; ++k1) {
for(int k2=0; k2<=1; ++k2) {
h[i][j][k1][k2]=INF;
for(int k3=0; k3<=1; ++k3) {
h[i][j][k1][k2]=min(h[i][j][k1][k2],h[i][j-1][k1][k3]+h[an[i][j-1]][j-1][k3][k2]);
}
}
}
}
}
}
int calc(int a,int x,int b,int y) {
if(dep[a]>dep[b])swap(a,b),swap(x,y);
int ta[2]= {INF,INF},tb[2]= {INF,INF};
ta[x]=f[a][x],tb[y]=f[b][y];
for(int i=21; i>=0; --i) {
if(dep[an[b][i]]>=dep[a]) {
int bx[2]= {INF,INF};
for(int j=0; j<=1; ++j) {
for(int k=0; k<=1; ++k) {
bx[j]=min(bx[j],tb[k]+h[b][i][k][j]);
}
}
b=an[b][i];
tb[0]=bx[0],tb[1]=bx[1];
}
}
if(a==b) {
return tb[x]+g[a][x];
}
for(int i=21; i>=0; --i) {
if(an[b][i]!=an[a][i]) {
int ax[2]= {INF,INF},bx[2]= {INF,INF};
for(int j=0; j<=1; ++j) {
for(int k=0; k<=1; ++k) {
ax[j]=min(ax[j],ta[k]+h[a][i][k][j]);
bx[j]=min(bx[j],tb[k]+h[b][i][k][j]);
}
}
a=an[a][i],b=an[b][i];
tb[0]=bx[0],tb[1]=bx[1],ta[0]=ax[0],ta[1]=ax[1];
}
}
int lca=an[b][0];
int ans0=f[lca][0]+g[lca][0]+ta[1]+tb[1]-f[a][1]-f[b][1];
int ans1=f[lca][0]+g[lca][0]+min(ta[0],ta[1])+min(tb[0],tb[1])-min(f[a][0],f[a][1])-min(f[b][0],f[b][1]);
return min(ans0,ans1);
}
void answer() {
for(int i=1; i<=m; ++i) {
int a,b,x,y;
cin>>a>>x>>b>>y;
int ans=calc(a,x,b,y);
cout<<(ans>=INF?-1:ans)<<"\n";
}
}
signed main() {
read();
dfs1(1,0);
dfs2(1,0);
dp();
answer();
}