倍增LCA
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
int tot=0;
const int maxn=50000+5;
int fa[maxn][25],dist[maxn],deep[maxn];
int first[maxn],next[maxn<<1];
struct edge
{
int f,t,v;
}es[maxn<<1];
void build(int f,int t,int v)
{
es[++tot]=(edge){f,t,v};
next[tot]=first[f];
first[f]=tot;
}
void init(int q,int h)
{
for(int i=first[h];i;i=next[i])
{
int at=es[i].t;
int av=es[i].v;
if(at==q) continue;
fa[at][0]=h;
dist[at]=dist[h]+av;
deep[at]=deep[h]+1;
init(h,at);
}
}
void make_lca()
{
for(int i=1;i<=log2(n);i++)
for(int j=1;j<=n;j++)
fa[j][i]=fa[fa[j][i-1]][i-1];
}
int lca(int x,int y)
{
if(deep[x]<deep[y]) swap(x,y);
for(int i=log2(n);i>=0;i--)
{
if(deep[fa[x][i]]>=deep[y])
x=fa[x][i];
}
if(x==y) return x;
for(int i=log2(n);i>=0;i--)
{
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int main()
{
int a,b,c;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
build(a,b,c);
build(b,a,c);
}
scanf("%d",&m);
init(0,0);
make_lca();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
int ans=dist[a]+dist[b]-2*(dist[lca(a,b)]);
printf("%d\n",ans);
}
return 0;
}