1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<cstdio> #include<iostream> #include<vector> #define pb push_back using namespace std; const int INF=1e9+7; const int N=5e4+7,Log=16; int n; int val[N]; int up[N][Log],down[N][Log],mx[N][Log],mn[N][Log],f[N][Log]; int dep[N]; vector<int>g[N]; inline void dfs(int u,int fa){ dep[u]=dep[fa]+1; f[u][0]=fa,mx[u][0]=mn[u][0]=val[u]; for(int j=1;j<Log;j++){ f[u][j]=f[f[u][j-1]][j-1]; mx[u][j]=max(mx[u][j-1],mx[f[u][j-1]][j-1]); mn[u][j]=min(mn[u][j-1],mn[f[u][j-1]][j-1]); up[u][j]=max(up[u][j-1],max(up[f[u][j-1]][j-1],mx[f[u][j-1]][j-1]-mn[u][j-1])); down[u][j]=max(down[u][j-1],max(down[f[u][j-1]][j-1],mx[u][j-1]-mn[f[u][j-1]][j-1])); } for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(v==fa) continue; dfs(v,u); } } inline int lca(int u,int v){ if(dep[u]<dep[v]) swap(u,v); for(int j=Log-1;j>=0;j--){ if(dep[f[u][j]]>=dep[v]) u=f[u][j]; } if(u==v) return u; for(int j=Log-1;j>=0;j--){ if(f[u][j]!=f[v][j]) u=f[u][j],v=f[v][j]; } return f[u][0]; } int main(){ #ifndef ONLINE_JUDGE freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&val[i]); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); g[u].pb(v),g[v].pb(u); } dfs(1,0); int q; scanf("%d",&q); while(q--){ int u,v; scanf("%d%d",&u,&v); int ans=0,anc=lca(u,v),MX=0,MN=INF; for(int j=Log-1;j>=0;j--){ if(dep[f[u][j]]>=dep[anc]) ans=max(ans,max(up[u][j],mx[u][j]-MN)),MN=min(MN,mn[u][j]),u=f[u][j]; } ans=max(ans,val[anc]-MN),MN=min(MN,val[anc]); for(int j=Log-1;j>=0;j--){ if(dep[f[v][j]]>=dep[anc]) ans=max(ans,max(down[v][j],MX-mn[v][j])),MX=max(MX,mx[v][j]),v=f[v][j]; } ans=max(ans,MX-val[anc]),MX=max(MX,val[anc]); printf("%d\n",max(ans,MX-MN)); } return 0; }
|