#include<bits/stdc++.h>
using namespace std;
#define int long long
#define nl '\n'
const int N = 5e4+1, lg = 17;
vector<pair<int,int>> g[N];
int mn[2*N][lg], ix[2*N][lg];
int in[N], dep[N];
int cnt;
void dfs(int v, int p){
in[v] = cnt;
mn[cnt][0] = in[v];
ix[cnt][0] = v;
cnt++;
for(auto [ch, w] : g[v]){
if(ch == p) continue;
dep[ch] = dep[v]+w;
dfs(ch, v);
mn[cnt][0] = in[v];
ix[cnt][0] = v;
cnt++;
}
}
void precomp(){
dfs(0, -1);
for(int j=1; j<lg; j++){
for(int i=0; i+(1<<j)-1 < 2*N; i++){
int l = mn[i][j-1], r = mn[i+(1<<(j-1))][j-1];
mn[i][j] = min(l, r);
ix[i][j] = (l <= r ? ix[i][j-1] : ix[i+(1<<(j-1))][j-1]);
}
}
}
int lca(int x, int y){
x = in[x];
y = in[y];
if(x > y) swap(x, y);
int lg = log2(y-x+1);
return (mn[x][lg] <= mn[y-(1<<lg)+1][lg] ? ix[x][lg] : ix[y-(1<<lg)+1][lg]);
}
int dis(int x, int y){
return dep[y] - dep[x];
}
inline void solve(){
int n;
cin>>n;
for(int i=1; i<n; i++){
int a, b, w;
cin>>a>>b>>w;
g[a].push_back({b, w});
g[b].push_back({a, w});
}
precomp();
int q;
cin>>q;
while(q--){
vector<int> v(5);
for(int &i : v) cin>>i;
int rt = v[0];
for(int i=1; i<5; i++) rt = lca(rt, v[i]);
int ans = dis(rt, v[0]);
for(int i=1; i<5; i++){
int mn = 1e18;
for(int j=0; j<i; j++){
mn = min(mn, dis(lca(v[j], v[i]), v[i]));
}
ans += mn;
}
cout<<ans<<nl;
}
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);cout.tie(NULL);
int t = 1;
//cin>>t;
while(t--) solve();
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... |