#pragma GCC optimize("Ofast") #include #define rep(i,n) for(int i=0;i>x[i]; #define ft first #define sc second #define pb push_back #define lb lower_bound #define ub upper_bound #define all(v) (v).begin(),(v).end() #define mod 1000000007 #define FS fixed< using V=vector; using Graph = vector>; using P=pair; typedef unsigned long long ull; typedef long double ldouble; template inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } template inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; } const ll INF=1e18; const int max_E=100005,max_log_v=30;//調整 //入力 vector G[max_E]; int root; int N;//頂点数 int par[max_log_v][max_E];//親を2^k回辿って到達する頂点(根を通り過ぎる場合は-1) int depth[max_E];//根からの深さ void dfs(int v,int p,int d){ par[0][v]=p; depth[v]=d; for(int i=0;idepth[v]) swap(u,v); for(int k=0;k>k&1){ v=par[k][v]; } } if(u==v) return u; //二分探索でLCAを求める for(int k=max_log_v-1;k>=0;k--){ if(par[k][u]!=par[k][v]){ u=par[k][u]; v=par[k][v]; } } return par[0][u]; } const ll MAX_N=(1<<19); ll n,K,dat[2*MAX_N-1];//n...segmenttreeの葉の大きさ,N...与えられた数列等の大きさ ll a[1000000]; ll unit(){ return -1;//単位元 } ll calc(ll a,ll b){ if(a==-1||b==-1) return max(a,b); return lca(a,b);//演算 } //初期化 void init(){ n=1; while(n0){ k=(k-1)/2; dat[k]=calc(dat[2*k+1],dat[2*k+2]);//条件 } } ll query(ll a,ll b,ll k,ll l,ll r){ if(r<=a||b<=l) return unit();//単位元 if(a<=l&&r<=b) return dat[k]; ll m=(l+r)/2; ll u=query(a,b,2*k+1,l,m); ll v=query(a,b,2*k+2,m,r); return calc(u,v);//条件 } int main(){ cin.tie(0);ios::sync_with_stdio(false); int Q; cin>>N>>K>>Q; V C(N); cinf(N,C); //V a(K); rep(i,K){ cin>>a[i]; a[i]--; } rep(i,N-1){ int u,v; cin>>u>>v; u--;v--; G[u].push_back(v); G[v].push_back(u); } V ma(N); ma[0]=C[0]; V dist(N,-1); queue que; que.push(0); dist[0]=0; while(!que.empty()){ int v=que.front(); que.pop(); for(int nv:G[v]){ if(dist[nv]!=-1) continue; dist[nv]=dist[v]+1; que.push(nv); ma[nv]=max(C[nv],ma[v]); } } init_(N); init(); rep(i,K) update(i,a[i]); while(Q--){ int t; cin>>t; if(t==1){ int x,y; cin>>x>>y; x--;y--; update(x,y); }else{ ll l,r; cin>>l>>r; l--;r--; ll x=query(l,r+1,0,0,n); cout<