#include<bits/stdc++.h>
#define mn(a, b) (dfn[a] < dfn[b] ? a : b)
#define pb push_back
using namespace std;
const int N = 8e4 + 7, M = 1e8 + 7;
int i, j, k, n, m, X, idx, ql, a, b, Q;
int L[N], R[N], dfn[N], t[N], fa[N], f[20][N<<1], ans[N];
vector<int> d[N];
struct Yoi {
int op, id, x, y, v;
} q[N * 10], lq[N * 10], rq[N * 10];
struct BIT {
int t[N];
void add(int x, int y) {for(; x<N; x+=-x&x) t[x] += y;}
int ask(int x, int s=0) {for(; x; x-=-x&x) s += t[x]; return s;}
} T;
void dfs(int x) {
f[0][dfn[x]=++X] = x, L[x] = ++idx;
for(int y : d[x]) if(!dfn[y]) dfs(y), fa[y] = f[0][++X] = x;
R[x] = idx;
}
int lca(int x, int y) {
if((x=dfn[x]) > (y=dfn[y])) swap(x, y);
int k = __lg(y - x + 1);
return mn(f[k][x], f[k][y-(1<<k)+1]);
}
void upd(int x, int y) {
T.add(L[x], y), T.add(R[x] + 1, -y);
}
int res(int x, int y) {
int s = 0, l = lca(x, y);
s = T.ask(L[x]) + T.ask(L[y]) - T.ask(L[l]) - T.ask(L[fa[l]]);
return s;
}
void solve(int l, int r, int L, int R) {
if(L > R) return;
if(l == r) {
for(int i=L; i<=R; i++) if(!q[i].op) ans[q[i].id] = l;
return;
}
int i, j, mid = l + r >> 1, ql = 0, qr = 0;
for(i=L; i<=R; i++) {
if(q[i].op) {
if(q[i].y > mid) upd(q[i].x, q[i].v), rq[++qr] = q[i];
else lq[++ql] = q[i];
} else {
if(res(q[i].x, q[i].y) < q[i].v) lq[++ql] = q[i];
else rq[++qr] = q[i];
}
}
for(i=L,j=1; j<=ql; i++,j++) q[i] = lq[j];
ql = i - 1;
for(j=1; j<=qr; j++,i++) q[i] = rq[j];
qr = ql + 1;
solve(l, mid, L, ql);
for(i=L; i<=R; i++) {
if(q[i].op && q[i].y > mid) upd(q[i].x, -q[i].v);
}
solve(mid+1, r, qr, R);
}
int main() {
scanf("%d%d", &n, &Q);
for(i=1; i<=n; i++) scanf("%d", &t[i]);
for(i=1; i<=n; i++) {
q[++ql] = {1, 0, i, t[i], 1};
}
for(i=1; i<n; i++) {
scanf("%d%d", &a, &b);
d[a].pb(b), d[b].pb(a);
}
dfs(1);
for(j=1; j<20; j++) for(i=1; i+(1<<j)-1<=X; i++) f[j][i] = mn(f[j-1][i], f[j-1][i+(1<<j-1)]);
for(i=1; i<=Q; i++) {
scanf("%d%d%d", &k, &a, &b);
if(k) q[++ql] = {0, i, a, b, k};
else {
q[++ql] = {1, 0, a, t[a], -1};
t[a] = b, ans[i] = -2;
q[++ql] = {1, 0, a, t[a], 1};
}
}
solve(-1, M, 1, ql);
for(i=1; i<=Q; i++) if(ans[i] != -2) {
if(ans[i] == -1) puts("invalid request!");
else printf("%d\n", ans[i]);
}
return 0;
}
小清新马蜂求调