| 比赛 | 2025.10.24 | 评测结果 | AAAAAAAAATTTTTTTTTTT | 
    | 题目名称 | 坡伊踹 | 最终得分 | 45 | 
    | 用户昵称 | 会挽弯弓满月 | 运行时间 | 44.651 s | 
    | 代码语言 | C++ | 内存使用 | 33.37 MiB | 
    | 提交时间 | 2025-10-24 10:32:08 | 
显示代码纯文本
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=2e5+10;
ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<48||c>57){
		if(c==45) f=-1;
		c=getchar();
	}
	while(c>=48&&c<=57){
		x=(x<<1)+(x<<3)+c-48;
		c=getchar();
	}
	return f*x;
}
ll bb;
ll n,Q,rt;
ll a[N];
struct node{
	ll to,nxt,val;
}e[N<<1];
ll h[N],tot;
void add(ll u,ll v,ll w){
	e[++tot].to=v;
	e[tot].val=w;
	e[tot].nxt=h[u];
	h[u]=tot;
	return;
}
ll fan[N];
ll f[N][25];
ll dis[N],dep[N];
ll lg[N];
queue<ll> q;
void init(){
	for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
	q.push(rt);dis[rt]=0;dep[rt]=1;
	ll u,v,w;
	while(q.size()){
		u=q.front();q.pop();
		for(ll i=h[u];i;i=e[i].nxt){
			v=e[i].to;w=e[i].val;
			if(dep[v]) continue;
			dis[v]=dis[u]+w;
			dep[v]=dep[u]+1;
			f[v][0]=u;
			for(int j=1;j<=bb;j++)
				f[v][j]=f[f[v][j-1]][j-1];
			q.push(v);
		}
	}
	return;
}
ll lca(ll x,ll y){
	if(dep[x]<dep[y]) swap(x,y);
	for(ll i=bb;i>=0;i--)
		if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(ll i=bb;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
ll to[N];
ll solve(ll x,ll y){
	if(x==y) return a[x];
	ll p=lca(x,y),u=x,di,ans=a[x],res;
	bool flag=0;
	while(u!=p){
		u=f[u][0];
		di=dis[x]-dis[u];
		res=max(di,a[u]);
		ans=min(ans,res);
		if(di>a[u]){
			flag=1;
			break;
		}
	}
	if(flag) return ans;
	u=y;
	while(u!=p){
		to[f[u][0]]=u;
		u=f[u][0];
	}
	while(u!=y){
		u=to[u];
		di=dis[x]+dis[u]-2*dis[p];
		res=max(di,a[u]);
		ans=min(ans,res);
		if(di>a[u]) break;
	}
	return ans;
}
ll ans;
int main(){
	freopen("poitry.in","r",stdin);
	freopen("poitry.out","w",stdout);
	n=read();Q=read();
	bb=log(n)/log(2)+1;
	rt=1;
	for(int i=1;i<=n;i++) a[i]=read();
	ll u,v,w;
	for(int i=1;i<n;i++){
		u=read();v=read();w=read();
		add(u,v,w);add(v,u,w);
	}
	init();
	while(Q--){
		u=read();v=read();
		ans=solve(u,v);
		printf("%lld\n",ans);
	}
	return 0;
}