实在不敢发学术,就发灌水了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2e4+5;
struct e{
int to,k;
};
vector<ll> a[MAXN],kk[MAXN];
ll n,m,f[MAXN][20],sh[MAXN],qf[MAXN][20];
void dfs(int no,int fa,int k){
sh[no]=sh[fa]+1;
f[no][0]=fa,qf[no][0]=k;
for(int i=1;i<=19;++i){
f[no][i]=f[f[no][i-1]][i-1];
qf[no][i]=qf[no][i-1]+qf[qf[no][i-1]][i-1];
}
for(int i=0;i<a[no].size();++i){
if(a[no][i]==fa)continue;
dfs(a[no][i],no,kk[no][i]);
}
}
ll lca(ll x,ll y){
ll ans=0;
if(sh[y]>sh[x])swap(x,y);
for(int i=19;i>=0;--i){
if(sh[f[x][i]]>=sh[y]){
ans+=qf[x][i];
x=f[x][i];
}
}
if(x==y)return ans;
for(int i=19;i>=0;--i){
if(f[x][i]!=f[y][i]){
ans+=qf[x][i]+qf[y][i];
x=f[x][i];
y=f[y][i];
}
}
return ans+qf[x][0]+qf[y][0];
}
int main(){
cin>>n>>m;
for(int i=1;i<n;++i){
ll x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
a[x].push_back(y);
kk[x].push_back(k);
a[y].push_back(x);
kk[y].push_back(k);
}
dfs(1,0,0);
while(m--){
ll x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",lca(x,y));
}
return 0;
}