#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10,Log=22;
const long long MAXX=3e18;
int n,k,q;
long long v[N],minson[N];
int fa[N][Log];
int deg[N];
struct edge{
long long a[3][3];
void claer()
{
for(int i=0;i<k;i++) for(int j=0;j<k;j++) a[i][j]=MAXX;
for(int i=0;i<k;i++) a[i][i]=0;
}
void pout()
{
for(int i=0;i<k;i++)
{
for(int j=0;j<k;j++)
{
if(a[i][j]!=2e9)printf("%d ",a[i][j]);
else printf("+ ");
}
printf("\n");
}
printf("\n");
printf("\n");
}
edge operator*(edge &x) const{
edge c;
for(int i=0;i<k;i++)
{
for(int j=0;j<k;j++)
{
c.a[i][j]=MAXX;
for(int l=0;l<k;l++)
{
c.a[i][j]=min(c.a[i][j],a[i][l]+x.a[l][j]);
}
}
}
return c;
}
};
edge mat[N][Log];
edge fmat[N][Log];
edge ben[N];
edge atf,ftb;
vector<int> ma[N];
void dfs(int u)
{
deg[u]=deg[fa[u][0]]+1;
minson[u]=MAXX;
for(int i=1;i<Log;i++)
fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=0;i<ma[u].size();i++)
{
minson[u]=min(minson[u],v[ma[u][i]]);
if(ma[u][i]==fa[u][0]) continue;
fa[ma[u][i]][0]=u;
dfs(ma[u][i]);
}
}
void dfs2(int u)
{
if(k==1)
{
ben[u].a[0][0]=fmat[u][0].a[0][0]=mat[u][0].a[0][0]=v[u];
}
else if(k==2)
{
ben[u].a[0][0]=fmat[u][0].a[0][0]=mat[u][0].a[0][0]=v[u];
ben[u].a[0][1]=fmat[u][0].a[0][1]=mat[u][0].a[0][1]=v[u];
ben[u].a[1][0]=fmat[u][0].a[1][0]=mat[u][0].a[1][0]=0;
ben[u].a[1][1]=fmat[u][0].a[1][1]=mat[u][0].a[1][1]=MAXX;
}
else if(k==3)
{
ben[u].a[0][0]=fmat[u][0].a[0][0]=mat[u][0].a[0][0]=v[u];
ben[u].a[0][1]=fmat[u][0].a[0][1]=mat[u][0].a[0][1]=v[u];
ben[u].a[0][2]=fmat[u][0].a[0][2]=mat[u][0].a[0][2]=v[u];
ben[u].a[1][0]=fmat[u][0].a[1][0]=mat[u][0].a[1][0]=0;
ben[u].a[1][1]=fmat[u][0].a[1][1]=mat[u][0].a[1][1]=minson[u];
ben[u].a[1][2]=fmat[u][0].a[1][2]=mat[u][0].a[1][2]=minson[u];
ben[u].a[2][0]=fmat[u][0].a[2][0]=mat[u][0].a[2][0]=MAXX;
ben[u].a[2][1]=fmat[u][0].a[2][1]=mat[u][0].a[2][1]=0;
ben[u].a[2][2]=fmat[u][0].a[2][2]=mat[u][0].a[2][2]=MAXX;
}
mat[u][0]=ben[fa[u][0]];
for(int r=1;r<Log;r++)
{
if(!fa[u][r-1]||!fa[fa[u][r-1]][r-1]) continue;
fmat[u][r]=fmat[u][r-1]*fmat[fa[u][r-1]][r-1];
mat[u][r]=mat[fa[u][r-1]][r-1]*mat[u][r-1];
}
for(int i=0;i<ma[u].size();i++)
{
if(ma[u][i]==fa[u][0]) continue;
dfs2(ma[u][i]);
}
}
void lca(int a,int b)
{
if(deg[b]>deg[a]) swap(a,b);
long long ben1=v[a];
atf.claer();ftb.claer();
for(int i=Log-1;i>=0;i--)
{
if(deg[fa[a][i]]>=deg[b])
{
atf=mat[a][i]*atf;
a=fa[a][i];
}
}
if(a==b) return void(printf("%lld\n",atf.a[0][0]+ben1));
for(int i=Log-1;i>=0;i--)
{
if(fa[a][i]!=fa[b][i])
{
atf=mat[a][i]*atf;
ftb=ftb*fmat[b][i];
a=fa[a][i],b=fa[b][i];
}
}
atf=ftb*ben[b]*ben[fa[a][0]]*atf;
printf("%lld\n",atf.a[0][0]+ben1);
}
signed main()
{
cin >> n >> q >> k;
for(int i=1;i<=n;i++) cin >> v[i];
for(int i=1;i<n;i++)
{
int x,y;
cin >> x >> y;
ma[x].push_back(y);
ma[y].push_back(x);
}
dfs(1);
dfs2(1);
while(q--)
{
int x,y;
cin >> x >> y;
lca(x,y);
}
return 0;
}
record