#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100'000 + 10;
int n, m, q;
pair<int, int> edge[N];
struct CP { 
	int p, c;
	friend istream& operator >> (istream& is, CP& rhs) { 
		return is >> rhs.p >> rhs.c;
	}
} cp[N];
struct Query { 
	int s, t, x, y;
	friend istream& operator >> (istream& is, Query& rhs) { 
		return is >> rhs.s >> rhs.t >> rhs.x >> rhs.y;
	}
} query[N];
vector<int> ad[N];
int f[N][17];
int st[N], ed[N], num;
void dfs(int u, int p = -1) { 
	st[u] = ++num;
	for (int i = 1; i <= 16; ++i) f[u][i] = f[f[u][i - 1]][i - 1];
	for (const auto& v : ad[u]) { 
		if (v == p) continue;
		f[v][0] = u;
		dfs(v, u);
	}
	ed[u] = num;
}
inline bool anc(int u, int v) { return st[u] <= st[v] && ed[u] >= ed[v]; }
int lca(int u, int v) { 
	if (anc(u, v)) return u;
	if (anc(v, u)) return v;
	
	for (int i = 16; i >= 0; --i)
		if (!anc(f[u][i], v)) u = f[u][i];
	return f[u][0];
}
vector<int> save[N];
int32_t main() { 
	cin.tie(0)->sync_with_stdio(0);
	cin >> n >> m >> q;
	for (int i = 1; i < n; ++i) cin >> edge[i].first >> edge[i].second;
	for (int i = 1; i <= m; ++i) cin >> cp[i];
	for (int i = 1; i <= q; ++i) cin >> query[i];
	for (int i = 1; i < n; ++i) { 
		const auto& [u, v] = edge[i];
		ad[u].push_back(v);
		ad[v].push_back(u);
	}
	dfs(f[1][0] = 1);
	for (int i = 1; i < n; ++i) { 
		auto& [u, v] = edge[i];
		if (anc(v, u)) swap(u, v);
	}
	for (int i = 1; i <= m; ++i) { 
		const auto& [p, c] = cp[i];
		save[edge[p].second].push_back(i);
	}
	for (int i = 1; i <= q; ++i) { 
		auto [s, t, x, y] = query[i];
		vector<int> allCP;
		for (int u = s; !anc(u, t); u = f[u][0]) { 
			allCP.insert(allCP.end(), save[u].begin(), save[u].end());
		}
		for (int u = t; !anc(u, s); u = f[u][0]) { 
			allCP.insert(allCP.end(), save[u].begin(), save[u].end());
		}
		sort(allCP.begin(), allCP.end(), [&](int x, int y) { 
			return cp[x].c < cp[y].c;
		});
		
		for (const auto& idx : allCP) { 
			const auto& [p, c] = cp[idx];
			if (y >= c) y -= c;
			else x -= 1;
		}
		if (x < 0) cout << -1 << "\n";
		else cout << x << "\n";
	}
}
| # | 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... |