This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
#define v first
#define w second
const int maxn = 5e5 + 5;
using ll = long long;
using ii = pair<ll, ll>;
int N;
vector<ii> g[maxn], t[maxn];
int in[maxn], tym;
int lvl[maxn], dp[20][maxn];
ll dist[maxn];
ll f[maxn];
bool done[maxn];
void dfs(int u, int p, ll dd) {
	if(p == -1) lvl[u] = 0;
	else lvl[u] = lvl[p] + 1;
	dist[u] = dd;
	dp[0][u] = p;
	for(int i = 1; i <= 18; i++) {
		int mid = dp[i - 1][u];
		if(mid != -1) dp[i][u] = dp[i - 1][mid];
		else break;
	}
	in[u] = tym++;
	for(ii e : g[u]) {
		if(e.v != p) {
			dfs(e.v, u, e.w + dd);
		}
	}
}
int __lca(int u, int v) {
	if(lvl[u] > lvl[v]) swap(u, v);
	int d = lvl[v] - lvl[u];
	for(int i = 0; i < 19; i++) {
		if(d & (1 << i)) {
			v = dp[i][v];
		}
	}
	if(u == v) return u;
	for(int i = 18; i >= 0; i--) {
		if(dp[i][u] != dp[i][v]) {
			u = dp[i][u];
			v = dp[i][v];
		}
	}
	return dp[0][u];
}
void Init(int _N, int A[], int B[], int D[]) {
	N = _N;
	for(int i = 0; i < N - 1; i++) {
		int u = A[i], v = B[i], w = D[i];
		g[u].emplace_back(v, w);
		g[v].emplace_back(u, w);
	}
	memset(dp, -1, sizeof dp);
	dfs(0, -1, 0LL);
}
long long Query(int S, int X[], int T, int Y[]) {
	// find nodes
	vector<int> all;
	for(int i = 0; i < S; i++) {
		all.emplace_back(X[i]);
	}
	for(int i = 0; i < T; i++) {
		all.emplace_back(Y[i]);
	}
	sort(all.begin(), all.end(), [](int x, int y){ return in[x] < in[y]; });
	all.erase(unique(all.begin(), all.end()), all.end());
	int sz = all.size();
	for(int i = 1; i < sz; i++) {
		all.emplace_back(__lca(all[i - 1], all[i]));
	}
	sort(all.begin(), all.end(), [](int x, int y){ return in[x] < in[y]; });
	all.erase(unique(all.begin(), all.end()), all.end());
	// clear
	for(int u : all) {
		t[u].clear();
		f[u] = 1e18;
		done[u] = false;
	}
	// build tree
	for(int i = 1; i < all.size(); i++) {
		int u = __lca(all[i - 1], all[i]);
		int v = all[i];
		ll w = dist[v] - dist[u];
		t[u].emplace_back(ii(v, w));
		t[v].emplace_back(ii(u, w));
	}
	// Dijkstra
	priority_queue<ii, vector<ii>, greater<ii>> Q;
	for(int i = 0; i < S; i++) {
		f[X[i]] = 0;
		Q.emplace(0, X[i]);
	}
	while(Q.size()) {
		int u = Q.top().second;
		Q.pop();
		if(done[u]) continue;
		done[u] = true;
		for(ii &e : t[u]) {
			if(f[e.v] > f[u] + e.w) {
				f[e.v] = f[u] + e.w;
				Q.emplace(f[e.v], e.v);
			}
		}
	}
	ll ans = 1e18;
	for(int i = 0; i < T; i++) {
		ans = min(ans, f[Y[i]]);
	}
	return ans;
}
Compilation message (stderr)
factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:96:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 1; i < all.size(); i++) {
                 ~~^~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |