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
| #include<iostream> #include<cstdio> using namespace std; int mn[200005][18],mx[200005][18],h[200005][18],ans[200005][18]; int a[200005]; int head[200005],nxt[200005],vet[200005],num; int n,q; void addedge(int x,int y) { num++; vet[num]=y; nxt[num]=head[x]; head[x]=num; } void dfs(int x,int fa) { if (fa>0) { int v=fa,tmp=0; h[x][0]=fa; mx[x][0]=max(a[x],a[fa]); mn[x][0]=min(a[x],a[fa]); if (a[x]<a[fa]) ans[x][0]=a[fa]-a[x]; while (v>0) { h[x][tmp+1]=h[v][tmp]; mx[x][tmp+1]=max(mx[x][tmp],mx[v][tmp]); mn[x][tmp+1]=min(mn[x][tmp],mn[v][tmp]); ans[x][tmp+1]=max(ans[x][tmp],max(ans[v][tmp],mx[v][tmp]-mn[x][tmp])); v=h[v][tmp]; tmp++; } } for (int e=head[x];e!=0;e=nxt[e]) dfs(vet[e],x); } int main() { freopen("tree.in","r",stdin); freopen("tree.out","w",stdout); cin >> n; for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); addedge(y,x); } dfs(1,0); cin >> q; while (q--) { int x,k; scanf("%d%d",&x,&k); k--; int mnn=1e9,anss=0; while (k>0) { int tmp=0; while ((k&(1<<tmp))==0) tmp++; k^=(1<<tmp); anss=max(anss,max(ans[x][tmp],mx[x][tmp]-mnn)); mnn=min(mnn,mn[x][tmp]); x=h[x][tmp]; if (x==0) break; } printf("%d\n",anss); } return 0; }
|