#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector VI; typedef pair PII; #define REP(i,s,t) for(int i=(s);i<(t);i++) #define FILL(x,v) memset(x,v,sizeof(x)) #define MAXN 200005 int n, m, e, k; VI adj[MAXN], sadj[MAXN]; vector specialTs[MAXN]; bool isSpecial[MAXN]; int ts[MAXN], depth[MAXN]; ll ans[MAXN]; void dfs(int x, int p, int d, int lastSpecial) { depth[x] = d; if (isSpecial[x] || x == e) { if (x != e) sadj[lastSpecial].push_back(x); lastSpecial = x; } if (ts[x] != -1) { specialTs[lastSpecial].push_back(PII((ll)(d - depth[lastSpecial]) * ts[x], ts[x])); } for (int y : adj[x]) { if (y == p) continue; dfs(y, x, d + 1, lastSpecial); } } void dfsSpecial(int x) { vector &cur = specialTs[x]; for (int y : sadj[x]) { dfsSpecial(y); for (auto tt : specialTs[y]) cur.push_back(PII(tt.first + (ll)(depth[y] - depth[x]) * tt.second, tt.second)); } priority_queue pq; for (PII tt : cur) { pq.push(tt); if (x != e && pq.size() > k) pq.pop(); } cur.clear(); while (!pq.empty()) { cur.push_back(pq.top()); pq.pop(); } } int main() { cin >> n >> m >> k; REP(i,0,n-1) { int a, b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } FILL(ts, -1); unordered_map tToId; REP(i,0,m) { int p, t; cin >> p >> t; ts[p] = t; tToId[t] = i; } int c; cin >> e >> c; REP(i,0,c) { int x; cin >> x; isSpecial[x] = true; } dfs(e, -1, 0, -1); dfsSpecial(e); sort(specialTs[e].begin(), specialTs[e].end()); FILL(ans, -1); for (auto tt: specialTs[e]) ans[tToId[tt.second]] = tt.first; REP(i,0,m) cout << ans[i] << endl; return 0; }