记录编号 608230 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 3919.坡伊踹 最终得分 100
用户昵称 Gravatar淮淮清子 是否通过 通过
代码语言 C++ 运行时间 19.194 s
提交时间 2025-10-24 18:06:39 内存使用 45.38 MiB
显示代码纯文本
#include<iostream>
using namespace std;

#define int long long
const int MAXN = 2 * 1e5 + 5;
const int LOG = 20;

int n, q;
int fa[MAXN][LOG];
int minx[MAXN][LOG];
int a[MAXN];
struct node{
	int to, next, len;
}e[2 * MAXN];
int dep[MAXN], dis[MAXN];
int h[MAXN], tot = 0;

void add(int x, int y, int len){
	e[++ tot] = {y, h[x], len};
	h[x] = tot;
}

void dfs(int u, int f){
	dep[u] = dep[f] + 1;
	fa[u][0] = f;
	minx[u][0] = (f == 0) ? a[u] : min(a[u], a[f]);
	for(int i = h[u];i;i = e[i].next){
		int v = e[i].to, w = e[i].len;
		if(v == f) continue;
		dis[v] = dis[u] + w;
		dfs(v, u);
	}
}

void Init(){
	for(int k = 1;k < LOG;k ++){
		for(int u = 1;u <= n;u ++){
			fa[u][k] = fa[fa[u][k - 1]][k - 1];
			minx[u][k] = min(minx[u][k - 1], minx[fa[u][k - 1]][k - 1]);
		}
	}
}

int lca(int u, int v){
	if(dep[u] < dep[v]) swap(u, v);
	for(int k = LOG - 1;k >= 0;k --){
		if(dep[fa[u][k]] >= dep[v]){
			u = fa[u][k];
		}
	}
	if(u == v) return u;
	for(int k = LOG - 1;k >= 0;k --){
		if(fa[u][k] != fa[v][k]){
			u = fa[u][k];
			v = fa[v][k];
		}
	}
	return fa[u][0];
}

bool check(int u, int v, int lc, int k){
    int mn = a[u], x = u, y = v;
    // u -> lc
    for(int i = LOG - 1;i >=0;i --){
        int anc = fa[x][i];
        if(dep[anc] >= dep[lc] && dis[u] - dis[anc] <= k){
            mn = min(mn, minx[x][i]);
            x=anc;
        }
    }
    // v -> lc
    for(int i = LOG - 1;i >= 0;i --){
        int anc = fa[y][i];
        if(dep[anc] >= dep[lc] && dis[u] - dis[lc] + dis[anc] - dis[lc] > k)
            y = anc;
    }
    if(dis[u] - dis[lc] + dis[y] - dis[lc] > k) y = fa[y][0];
    for(int i = LOG - 1;i >= 0;i --){
        int anc = fa[y][i];
        if(dep[anc] >= dep[lc]){
            mn = min(mn, minx[y][i]);
            y = anc;
        }
    }
    return mn <= k;
}

signed main(){
	cin.tie(0) -> ios::sync_with_stdio(0);
	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;
		add(u, v, w); add(v, u, w);
	}
	dfs(1, 0);
	Init();
	for(int i = 1;i <= q;i ++){
		int u, v; cin >> u >> v;
		int LCA = lca(u, v);
		int l = 0, r = 1e9;
		while(l < r){
			int mid = (l + r) >> 1;
			if(check(u, v, LCA, mid)){
				r = mid;
			}
			else l = mid + 1;
		}
		cout << l << '\n';
	}
	return 0;
}