#include<bits/stdc++.h>
typedef int ii;
typedef long long ll;
using namespace std;
const string name = "";
const ii MOD = 1e9 + 7;
const ii N = 5e4 + 10;
ii n, q, a[N * 2];
vector<pair<ii, ii>> e[N];
void INP(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
if (fopen((name + ".inp").c_str(),"r")){
freopen((name + ".inp").c_str(),"r",stdin);
freopen((name + ".out").c_str(),"w",stdout);
}
cin >> n;
ii u, v, w;
for (ii i = 1;i < n;i++){
cin >> u >> v >> w;
u++;v++;
e[u].push_back(make_pair(v, w));
e[v].push_back(make_pair(u, w));
}
}
ii in[N], out[N], sum[N], cntdfs;
ii par[17][N];
stack<ii> st;
void dfs(ii u = 1, ii p = 0){
in[u] = ++cntdfs;
par[0][u] = p;
for (auto x : e[u]){
if (x.first != p){
sum[x.first] = sum[u] + x.second;
dfs(x.first, u);
}
}
out[u] = ++cntdfs;
}
bool IsPar(ii u, ii v){
return in[u] <= in[v] && out[v] <= out[u];
}
ii find_par(ii u, ii v){
if (IsPar(u, v)) return u;
if (IsPar(v, u)) return v;
for (ii bit = 16;bit >= 0;bit--){
if (!IsPar(par[bit][u], v) && par[bit][u] != 0) u = par[bit][u];
}
return par[0][u];
}
ii minPath(ii u, ii v){
ii p = find_par(u, v);
return sum[u] + sum[v] - 2 * sum[p];
}
bool dfsTimer(int u, int v){
return in[u] < in[v];
}
void solve_query(){
ii k = 5;
for(int i = 1; i <= k; ++i){
cin >> a[i];
a[i]++;
}
sort(a + 1, a + 1 + k, dfsTimer);
for(int i = 1; i < k; ++i){
a[i+k] = find_par(a[i], a[i+1]);
}
k = 2 * k - 1;
sort(a + 1, a + 1 + k, dfsTimer);
k = unique(a + 1, a + 1 + k) - a - 1;
ii res = 0, u;
for (ii i = 1;i <= k;i++){
while(!st.empty() && !IsPar(st.top(), a[i])) st.pop();
if (!st.empty()){
u = st.top();
res = res + minPath(u, a[i]);
}
st.push(a[i]);
}
while(!st.empty()) st.pop();
cout << res << "\n";
}
int main(){
INP();
dfs();
for (ii bit = 1;bit < 17;bit++){
for (ii i = 1;i <= n;i++){
par[bit][i] = par[bit - 1][par[bit - 1][i]];
}
}
cin >> q;
while(q--){
solve_query();
}
return 0;
}
//NGT 1600-2000 cf
//1/200 hard quests
컴파일 시 표준 에러 (stderr) 메시지
roadsideadverts.cpp: In function 'void INP()':
roadsideadverts.cpp:17:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
17 | freopen((name + ".inp").c_str(),"r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
roadsideadverts.cpp:18:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
18 | freopen((name + ".out").c_str(),"w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | 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... |