#include<bits/stdc++.h>
#define endl '\n'
#define pb push_back
using namespace std;
const long long maxn = 2e5 + 10;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
long long n, m, q;
long long a[maxn], b[maxn], is[maxn], s[maxn];
vector < pair < long long, long long > > g[maxn];
long long dep[maxn], par[maxn];
long long dp[maxn];
long long silverset;
void dfs0(long long beg, long long from, long long above)
{
    dp[beg] = above;
    dep[beg] = dep[from] + 1;
    par[beg] = from;
    for (auto &[nb, i]: g[beg])
    {
        if(nb == from)continue;
        dfs0(nb, beg, above + is[i]);
    }
}
void read()
{
    cin >> n >> m >> q;
    for (long long i = 1; i < n; ++ i)
    {
        cin >> a[i] >> b[i];
        g[a[i]].pb(make_pair(b[i], i));
        g[b[i]].pb(make_pair(a[i], i));
    }
    for (long long i = 1; i <= m; ++ i)
    {
        long long road, silver;
        cin >> road >> silver;
        s[road] = silver;
        silverset = silver;
        is[road] = 1;
    }
    dfs0(1, 0, 0);
}
long long jump[maxn][20];
long long moveup(long long v, long long x)
{
    for (long long i = 0; i < 20; ++ i)
    {
        if((1 << i) & x)
        {
            v = jump[v][i];
        }
    }
    return v;
}
long long find_lca(long long u, long long v)
{
    long long du = dep[u], dv = dep[v];
    if(du > dv)swap(u, v);
    v = moveup(v, abs(du - dv));
    if(u == v)return u;
    for (long long i = 19; i >= 0; -- i)
    {
        if(jump[u][i] != jump[v][i])
        {
            u = jump[u][i];
            v = jump[v][i];
        }
    }
    return par[u];
}
int main()
{
    speed();
    read();
    for (long long i = 1; i <= n; ++ i)
        jump[i][0] = par[i];
    for (long long j = 1; j <  20; ++ j)
    {
        for (long long i = 1; i <= n; ++ i)
            jump[i][j] = jump[jump[i][j-1]][j-1];
    }
    while(q --)
    {
        long long si, ti, xi, yi;
        cin >> si >> ti >> xi >> yi;
        long long lca = find_lca(si, ti);
        long long tot = dp[si] + dp[ti] - 2*dp[lca];
        if(tot * silverset <= yi)cout << xi << endl;
        else
        {
            long long good = yi / silverset;
            if(xi >= tot - good)
            {
                cout << xi - (tot - good) << endl;
            }
            else cout << -1 << endl;
        }
    }
    return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |