比赛 CSP2023-S模拟赛 评测结果 EEEEEEAAAEEEEEEEEEEE
题目名称 坡伊踹 最终得分 15
用户昵称 李栋阳 运行时间 8.781 s
代码语言 C++ 内存使用 49.68 MiB
提交时间 2023-10-17 21:36:07
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[200005],dp[200005],e[200005];
int f[200005][21];
struct node{
	int nxt,w;
};
int n,q;
vector<node> tr[200005];
int lca(int a,int b){
	if(dp[a]>dp[b]) swap(a,b);
	for(int i=20;i>=0;i--){
		if(dp[a]<=dp[b]-(1<<i)){
			b=f[b][i];
		} 
	}
	if(a==b){
		return a;
	}
	for(int i=20;i>=0;i--){
		if(f[a][i]==f[b][i]){
			continue;
		}
		else {
			a=f[a][i],b=f[b][i];
		}
	}
	return f[a][0]; 
} 
void dfs(int u,int fa){
	dp[u]=dp[fa]+1;
	for(node i:tr[u]){
		int v=i.nxt;
		if(v!=fa){
			e[v]=e[u]+i.w;
			dfs(v,u);
		}
	}
	return;
}
int query1(int u,int v,int m){
	if(v==m) return max(a[v],e[u]+e[v]-2*e[m]);
	return min(max(a[v],e[u]+e[v]-2*e[m]),query1(u,f[v][0],m));
}
int query2(int u,int v,int m){
	if(v==m) return max(a[v],e[u]-e[v]);
	return min(max(a[v],e[u]-e[v]),query2(u,f[v][0],m));
}
signed main(){
	freopen("poitry.in","r",stdin);
	freopen("poitry.out","w",stdout);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	
	for(int i=1;i<n;i++){
		int u,v,w;
		cin>>u>>v>>w;
		tr[u].push_back({v,w});
		tr[v].push_back({u,w});
		f[v][0]=u;
	}
	dp[0]=0;
	dfs(1,0);
	while(q--){
		int u,v;
		cin>>u>>v;
		
		int m=lca(u,v);
		cout<<min(query1(u,v,m),query2(u,u,m))<<endl;
		
	}
}