2420 让我们异或吧
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int n;
int head[200000];
int depth[200000];
int f[200000][18][2];
int cnt=0;
struct Edge
{
int z;
int nexty;
int qz;
}edge[400000];
inline int dy()
{
int num=0;
char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')num=num*10+c-'0',c=getchar();
return num;
}
inline void add(int f,int z,int qz)
{
cnt++;
edge[cnt].z=z;
edge[cnt].qz=qz;
edge[cnt].nexty=head[f];
head[f]=cnt;
}
inline void build(int root)
{
int will,wqz;
for(int now=head[root];now!=-1;now=edge[now].nexty)
{
will=edge[now].z;
wqz=edge[now].qz;
if(!depth[will])
{
depth[will]=depth[root]+1;
f[will][0][0]=root;
f[will][0][1]=wqz;
_build(will);
}
}
}
inline int yh(int a,int b)
{
int yhh=0;
int sf=0;
int aw,bw;
while(a|b)
{
aw=a&1;
bw=b&1;
yhh+=((aw|bw)&((!aw)|(!bw)))<<(sf++);
a>>=1,b>>=1;
}
return yhh;
}
inline void work()
{
for(int i=1;i<=17;i++)
{
for(int j=1;j<=n;j++)
{
f[j][i][0]=f[f[j][i-1][0]][i-1][0];
f[j][i][1]=yh(f[j][i-1][1],f[f[j][i-1][0]][i-1][1]);
}
}
}
inline int lca(int a,int b)
{
if(depth[a]<depth[b])swap(a,b);
int yhh=0;
for(int i=17;i>=0;i--)
{
if(depth[f[a][i][0]]>=depth[b])
{
yhh=yh(yhh,f[a][i][1]);
a=f[a][i][0];
}
}
if(a==b)return yhh;
for(int i=17;i>=0;i--)
{
if(f[a][i][0]!=f[b][i][0])
{
yhh=yh(yh(f[a][i][1],f[b][i][1]),yhh);
a=f[a][i][0],b=f[b][i][0];
}
}
return yh(yh(f[a][0][1],f[b][0][1]),yhh);
}
int main()
{
depth[1]=1;
memset(head,-1,sizeof(head));
n=dy();
int a,b,qz;
for(int i=0;i<n-1;i++)
{
a=dy();b=dy();qz=dy();
add(a,b,qz);
add(b,a,qz);
}
build(1);
work();
int m;
m=dy();
for(int i=0;i<m;i++)
{
a=dy();b=dy();
printf("%d\n",lca(a,b));
}
return 0;
}