#include <bits/stdc++.h>
/*
    --> Author: Megumi_Kato__8703
    ""
*/
#define int long long
#define fi first
#define se second
#define pii pair<int, int>
#define all(a) a.begin(), a.end()
using namespace std;
const int mn = 1e5 + 5;
int n, m, q, st[mn], d[mn], sz[mn], heavy[mn], par[mn], head[mn], id[mn], ft[mn], euler[mn], l[mn], r[mn], timer = 0, chains = 0;
pii edge[mn];
vector <int> a[mn], event[mn];
void pre_dfs(int u, int p){
    sz[u] = 1;
    for(auto v : a[u]){
        if(v == p) continue;
        par[v] = u;
        d[v] = d[u] + 1;
        pre_dfs(v, u);
        sz[u] += sz[v];
        if(sz[v] > sz[heavy[u]]) heavy[u] = v;
    }
    ft[u] = timer;
}
void decompose(int u, int h){
    st[u] = ++timer;
    euler[timer] = u;
    head[u] = h, id[u] = chains;
    if(heavy[u]) decompose(heavy[u], h);
    for(auto v : a[u]){
        if(v != par[u] && v != heavy[u]){
            chains ++;
            decompose(v, v);
        }
    }
    ft[u] = timer;
}
int lca(int u, int v){
    while(id[u] != id[v]){
        if(id[u] > id[v]){
            u = par[head[id[u]]];
        }
        else{
            v = par[head[id[v]]];
        }
    }
    if(d[u] < d[v]) return u;
    return v;
}
struct Megumi{
    int u, v, w;
    bool operator<(const Megumi& other){
        return w < other.w;
    }
} e[mn];
struct query{
    int s, t, x, y;
} reina[mn];
int bit[2][mn], ans[mn];
void add(int c, int u, int val){
    while(u <= n){
        bit[c][u] += val;
        u += (u & -u);
    }
}
int get(int c, int u){
    int res = 0;
    while(u){
        res += bit[c][u];
        u -= (u & -u);
    }
    return res;
}
void solve(){
    cin >> n >> m >> q;
    for(int i = 1; i <= n - 1; i++){
        cin >> edge[i].fi >> edge[i].se;
        auto[u, v] = edge[i];
        a[u].push_back(v);
        a[v].push_back(u);
    }
    pre_dfs(1, 0);
    decompose(1, 1);
    for(int i = 1; i <= m; i++){
        int p, w; cin >> p >> w;
        auto[u, v] = edge[p];
        e[i] = {u, v, w};
    }
    sort(e + 1, e + m + 1);
    for(int i = 1; i <= q; i++){
        ans[i] = 2e9;
        cin >> reina[i].s >> reina[i].t >> reina[i].x >> reina[i].y;
        l[i] = 1, r[i] = m;
    }
    while(true){
        bool ok = true;
        for(int i = 1; i <= q; i++){
            if(l[i] < r[i]){
                ok = false;
                int mid = (l[i] + r[i]) >> 1;
                event[mid].push_back(i);
            }
        }
        if(ok) break;
        for(int i = 1; i <= m; i++){
            auto[u, v, w] = e[i];
            add(1, st[v], 1);
            add(1, ft[v] + 1, - 1);
        }
        for(int i = 1; i <= m; i++){
            auto[u, v, w] = e[i];
            add(0, st[v], w);
            add(1, st[v], - 1);
            add(0, ft[v] + 1, - w);
            add(1, ft[v] + 1, 1);
            for(auto id : event[i]){
                auto[s, t, x, y] = reina[id];
                int p = lca(s, t);
                int w = get(0, st[s]) + get(0, st[t]) - 2 * get(0, st[p]);
                if(w <= y){
                    int nanase = get(1, st[s]) + get(1, st[t]) - 2 * get(1, st[p]);
                    if(nanase <= x) ans[id] = min(ans[id], x - nanase);
                    l[id] = i + 1;
                }
                else{
                    r[id] = i - 1;
                }
            }
        }
    }
    for(int i = 1; i <= q; i++){
        if(ans[i] < 2e9) cout << ans[i] << '\n';
        else cout << -1 << '\n';
    }
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    // cin >> t;
    while(t--){
        solve();
    }
}
| # | 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... |