提交时间:2024-09-30 13:29:26
运行 ID: 32756
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=2e5+10; int f[N][22],mn[N][22],mx[N][22]; int a[N];vector<int> e[N]; int fa[N][22],dep[N]; int n,q; inline void dfs(int u,int pa){ dep[u]=dep[pa]+1; fa[u][0]=pa;for(int i=1;i<=17;i++) fa[u][i]=fa[fa[u][i-1]][i-1]; for(auto v:e[u]){ if(v!=pa){ dfs(v,u); } } } inline void init(){ for(int i=0;i<=17;i++) fa[0][i]=0,mn[0][i]=0,mx[0][i]=0,f[0][i]=0; for(int i=1;i<=n;i++){ mn[i][0]=a[i],mx[i][0]=a[i],f[i][0]=0; }for(int j=1;j<=17;j++){ for(int i=1;i<=n;i++){ mn[i][j]=min(mn[i][j-1],mn[fa[i][j-1]][j-1]); mx[i][j]=max(mx[i][j-1],mx[fa[i][j-1]][j-1]); f[i][j]=max(max(f[i][j-1],f[fa[i][j-1]][j-1]),mx[fa[i][j-1]][j-1]-mn[i][j-1]); } } }inline void solve(){ int u,v;scanf("%d%d",&u,&v); int tmp=1e9,ans=0,now=u; for(int i=17;i>=0;i--){ if(dep[fa[now][i]]>=dep[v]-1){ //cout<<fa[now][i]<<' '<<fa[v][0]<<' '; ans=max(ans,f[now][i]); ans=max(ans,mx[now][i]-tmp); tmp=min(tmp,mn[now][i]);now=fa[now][i]; //cout<<ans<<' '<<i<<' '; } }printf("%d\n",ans); } int main(){ dep[1]=1;scanf("%d%d",&n,&q); for(int i=1;i<n;i++){ int u,v;scanf("%d%d",&u,&v); e[u].push_back(v);e[v].push_back(u); }dfs(1,0);for(int i=1;i<=n;i++) scanf("%d",&a[i]);init(); while(q--){ solve(); } }