1 #include<iostream>
2 #include<string>
3 #include<algorithm>
4 #include<cstdio>
5 #include<cstring>
6 #include<cstdlib>
7 #include<cmath>
8 #include<map>
9 using namespace std;
10
11 const int ONE=160005;
12 const int INF=1e8+1;
13
14 int n,m;
15 int x,y,k;
16 int a[ONE];
17 int next[ONE*2],first[ONE],go[ONE*2],tot;
18 int Num,res,cnt;
19 int record[ONE];
20 int Ans[ONE];
21
22 struct power
23 {
24 int cnt,opt,cur;
25 int pos,value;
26 int l,r,k;
27 }oper[ONE*10],qL[ONE*10],qR[ONE*10];
28
29 struct point
30 {
31 int f,son,size,dep;
32 int top,seg;
33 }S[ONE];
34
35 int get()
36 {
37 int res=1,Q=1;char c;
38 while( (c=getchar())<48 || c>57 )
39 if(c==‘-‘)Q=-1;
40 res=c-48;
41 while( (c=getchar())>=48 && c<=57 )
42 res=res*10+c-48;
43 return res*Q;
44 }
45
46 void Add(int u,int v)
47 {
48 next[++tot]=first[u]; first[u]=tot; go[tot]=v;
49 next[++tot]=first[v]; first[v]=tot; go[tot]=u;
50 }
51
52 namespace Sgt
53 {
54 struct power
55 {
56 int value;
57 }Node[ONE*4];
58
59 void Update(int i,int l,int r,int L,int x)
60 {
61 if(l==r)
62 {
63 Node[i].value+=x;
64 return;
65 }
66
67 int mid=(l+r)>>1;
68 if(L<=mid) Update(i<<1,l,mid,L,x);
69 else Update(i<<1|1,mid+1,r,L,x);
70 Node[i].value=Node[i<<1].value + Node[i<<1|1].value;
71 }
72
73 void Query(int i,int l,int r,int L,int R)
74 {
75 if(L<=l && r<=R)
76 {
77 res+=Node[i].value;
78 return;
79 }
80
81 int mid=(l+r)/2;
82 if(L<=mid) Query(i<<1,l,mid,L,R);
83 if(mid+1<=R) Query(i<<1|1,mid+1,r,L,R);
84 }
85 }
86
87 namespace Hld
88 {
89 void First()
90 {
91 S[1].top=S[0].seg=S[1].seg=1;
92 }
93
94 void Dfs1(int u,int father)
95 {
96 S[u].dep=S[father].dep+1;
97 S[u].f=father;
98 S[u].size=1;
99 for(int e=first[u];e;e=next[e])
100 {
101 int v=go[e];
102 if(v==father) continue;
103 Dfs1(v,u);
104 S[u].size+=S[v].size;
105 if(S[v].size > S[S[u].son].size) S[u].son=v;
106 }
107 }
108
109 void Dfs2(int u,int father)
110 {
111 if(S[u].son)
112 {
113 int v=S[u].son;
114 S[v].top=S[u].top;
115 S[v].seg=++S[0].seg;
116 Dfs2(v,u);
117 }
118 for(int e=first[u];e;e=next[e])
119 {
120 int v=go[e];
121 if(v==father || S[u].son==v) continue;
122 S[v].top=v;
123 S[v].seg=++S[0].seg;
124 Dfs2(v,u);
125 }
126 }
127
128 void Solve(int x,int y)
129 {
130 int Tx=S[x].top,Ty=S[y].top;
131 while(Tx!=Ty)
132 {
133 if(S[Tx].dep < S[Ty].dep)
134 {
135 swap(x,y);
136 swap(Tx,Ty);
137 }
138 Sgt::Query(1,1,n,S[Tx].seg,S[x].seg);
139 x=S[Tx].f;
140 Tx=S[x].top;
141 }
142 if(S[x].dep > S[y].dep) swap(x,y);
143 Sgt::Query(1,1,n,S[x].seg,S[y].seg);
144 }
145 }
146
147 void Solve(int l,int r,int L,int R)//第k大
148 {
149 if(l>r) return;
150 if(L==R)
151 {
152 for(int i=l;i<=r;i++)
153 if(oper[i].opt==3)
154 Ans[oper[i].cnt] = L-1;
155 return;
156 }
157
158 int M=(L+R)>>1;
159
160 for(int i=l;i<=r;i++)
161 {
162 if(oper[i].opt==1 && oper[i].value>=M)
163 Sgt::Update(1,1,n,S[oper[i].pos].seg,1);
164 if(oper[i].opt==2 && oper[i].value>=M)
165 Sgt::Update(1,1,n,S[oper[i].pos].seg,-1);
166 if(oper[i].opt==3)
167 {
168 res=0;
169 Hld::Solve(oper[i].l,oper[i].r);
170 record[i] = res;
171 }
172 }
173
174 for(int i=l;i<=r;i++)
175 {
176 if(oper[i].opt==1 && oper[i].value>=M)
177 Sgt::Update(1,1,n,S[oper[i].pos].seg,-1);
178 if(oper[i].opt==2 && oper[i].value>=M)
179 Sgt::Update(1,1,n,S[oper[i].pos].seg,1);
180 }
181
182 int l_num=0,r_num=0;
183 for(int i=l;i<=r;i++)
184 {
185 if(oper[i].opt!=3)
186 {
187 if(oper[i].value >= M)
188 qR[++r_num]=oper[i];
189 else
190 qL[++l_num]=oper[i];
191 }
192 else
193 {
194 if(oper[i].cur + record[i] >= oper[i].k)
195 qR[++r_num]=oper[i];
196 else
197 {
198 qL[++l_num]=oper[i];
199 qL[l_num].cur+=record[i];
200 }
201 }
202 }
203
204 int t=l;
205 for(int i=1;i<=l_num;i++) oper[t++]=qL[i];
206 for(int i=1;i<=r_num;i++) oper[t++]=qR[i];
207
208 Solve(l,l+l_num-1,L,M);
209 Solve(l+l_num,r,M+1,R);
210 }
211
212 int main()
213 {
214 n=get(); m=get();
215 for(int i=1;i<=n;i++)
216 {
217 a[i]=get();
218 oper[++cnt].opt=1; oper[cnt].pos=i; oper[cnt].value=a[i];
219 }
220
221 for(int i=1;i<n;i++)
222 {
223 x=get(); y=get();
224 Add(x,y);
225 }
226
227 Hld::First();
228 Hld::Dfs1(1,0); Hld::Dfs2(1,0);
229
230 for(int i=1;i<=m;i++)
231 {
232 k=get(); x=get(); y=get();
233 if(k==0)
234 {
235 oper[++cnt].opt=2; oper[cnt].pos=x; oper[cnt].value=a[x];
236 oper[++cnt].opt=1; oper[cnt].pos=x; oper[cnt].value=y;
237 a[x]=y;
238 }
239 else
240 {
241 oper[++cnt].opt=3; oper[cnt].l=x; oper[cnt].r=y; oper[cnt].k=k;
242 oper[cnt].cnt=++Num;
243 }
244 }
245
246 Solve(1,cnt,0,INF);
247
248 for(int i=1;i<=Num;i++)
249 {
250 if(Ans[i]!=-1) printf("%d",Ans[i]);
251 else printf("invalid request!");
252 printf("\n");
253 }
254 }