1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 5 using namespace std; 6 7 const int maxn=80000+5; 8 9 struct Edge 10 { 11 int to,next; 12 }edge[maxn<<1]; 13 14 int head[maxn]; 15 int tot; 16 int w[maxn]; 17 int dep[maxn]; 18 int ans[1000]; 19 int p[maxn][25]; 20 21 void init() 22 { 23 memset(dep,0,sizeof(dep)); 24 dep[1]=1; 25 memset(p,-1,sizeof(p)); 26 memset(w,-1,sizeof(w)); 27 memset(head,-1,sizeof(head)); 28 tot=1; 29 } 30 31 void addedge(int u,int v) 32 { 33 edge[tot].to=v; 34 edge[tot].next=head[u]; 35 head[u]=tot++; 36 } 37 38 void dfs(int u) 39 { 40 for(int i=head[u];~i;i=edge[i].next) 41 { 42 int v=edge[i].to; 43 if(!dep[v]) 44 { 45 dep[v]=dep[u]+1; 46 p[v][0]=u; 47 dfs(v); 48 } 49 } 50 } 51 52 void init_lca(int n) 53 { 54 for(int j=1;(1<<j)<=n;j++) 55 { 56 for(int i=1;i<=n;i++) 57 { 58 if(p[i][j-1]!=-1) 59 p[i][j]=p[p[i][j-1]][j-1]; 60 } 61 } 62 } 63 64 bool cmp(int a,int b) 65 { 66 return a>b; 67 } 68 69 int solve(int n,int a,int b,int k) 70 { 71 if(dep[a]<dep[b]) 72 swap(a,b); 73 74 int init_a=a; 75 int init_b=b; 76 77 int cnt; 78 79 for(cnt=0;(1<<cnt)<=dep[a];cnt++) 80 ; 81 cnt--; 82 83 for(int j=cnt;j>=0;j--) 84 { 85 if(dep[a]-(1<<j)>=dep[b]) 86 a=p[a][j]; 87 } 88 89 int lca; 90 91 if(a==b) 92 { 93 lca=b; 94 if(dep[init_a]-dep[lca]+1<k) 95 return -1; 96 } 97 98 else 99 { 100 for(int j=cnt;j>=0;j--) 101 { 102 if(p[a][j]!=-1&&p[a][j]!=p[b][j]) 103 { 104 a=p[a][j]; 105 b=p[b][j]; 106 } 107 } 108 lca=p[a][0]; 109 if(dep[init_a]+dep[init_b]-2*dep[lca]+1<k) 110 return -1; 111 } 112 113 tot=1; 114 115 for(int i=dep[init_a];i>=dep[lca];i--) 116 { 117 ans[tot++]=w[init_a]; 118 init_a=p[init_a][0]; 119 } 120 121 for(int i=dep[init_b];i>dep[lca];i--) 122 { 123 ans[tot++]=w[init_b]; 124 init_b=p[init_b][0]; 125 } 126 127 sort(ans+1,ans+tot,cmp); 128 129 return ans[k]; 130 131 132 } 133 134 int main() 135 { 136 int n,Q; 137 scanf("%d%d",&n,&Q); 138 139 init(); 140 141 for(int i=1;i<=n;i++) 142 scanf("%d",&w[i]); 143 144 for(int i=1;i<n;i++) 145 { 146 int a,b; 147 scanf("%d%d",&a,&b); 148 addedge(a,b); 149 addedge(b,a); 150 } 151 152 dfs(1); 153 154 init_lca(n); 155 156 for(int i=0;i<Q;i++) 157 { 158 int k,a,b; 159 scanf("%d%d%d",&k,&a,&b); 160 if(k==0) 161 { 162 w[a]=b; 163 } 164 else 165 { 166 int ans=solve(n,a,b,k); 167 if(ans==-1) 168 printf("invalid request!\n"); 169 else 170 printf("%d\n",ans); 171 } 172 } 173 return 0; 174 }