#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100010;
struct Q{
int u,v,t,id;
}q[N];
struct M{
int next,last,u;
}c[N];
int tp,type,n,m,qq,val[N],w[N],col[N],str[N],top[N],fa[N],son[N],siz[N],dep[N],cntc,cntq,be[N],block,idx,num[N],tim;
bool vis[N];
ll res,ans[N];
vector<int> e[N];
void dfs1(int u,int f){
int bt=tp;
str[++tp]=u;
fa[u]=f;
siz[u]=1;
dep[u]=dep[f]+1;
int mx=-1;
for(int v:e[u]){
if(v==f) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(tp-bt>block){
++idx;
while(tp>bt) be[str[tp--]]=idx;
}
if(siz[v]>mx){
mx=siz[v];
son[u]=v;
}
}
}
void dfs2(int u,int t){
top[u]=t;
if(!son[u]) return;
dfs2(son[u],t);
for(int v:e[u]){
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]) swap(x,y);
y=fa[top[y]];
}
return dep[x]<dep[y]?x:y;
}
bool cmp(Q x,Q y){
if(be[x.u]!=be[y.u]) return be[x.u]<be[y.u];
if(be[x.v]!=be[y.v]) return be[x.v]<be[y.v];
return x.t<y.t;
}
void add(int x){
++num[x];
res+=(ll)w[num[x]]*val[x];
}
void del(int x){
res-=(ll)w[num[x]]*val[x];
--num[x];
}
void updata(int x){
if(vis[x]){
del(col[x]);
vis[x]=0;
}
else{
add(col[x]);
vis[x]=1;
}
}
void modify(int x,int y){
if(vis[x]){
del(col[x]);
add(y);
}
col[x]=y;
}
void move(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
while(dep[x]>dep[y]){
updata(x);
x=fa[x];
}
while(x!=y){
updata(x);updata(y);
x=fa[x];y=fa[y];
}
}
int main(){
scanf("%d%d%d",&n,&m,&qq);
block=pow(n,2.0/3);
for(int i=1;i<=m;i++) scanf("%d",&val[i]);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1,u,v;i<n;i++){
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;i++){
scanf("%d",&col[i]);
str[i]=col[i];
}
for(int i=1,x,y;i<=qq;i++){
scanf("%d%d%d",&type,&x,&y);
if(type==0){
++cntc;
c[cntc].u=x;
c[cntc].last=str[x];
c[cntc].next=y;
str[x]=y;
}
else{
++cntq;
q[cntq].u=x;
q[cntq].v=y;
q[cntq].t=cntc;
q[cntq].id=cntq;
}
}
memset(str,0,sizeof(str));
dfs1(1,0);
dfs2(1,1);
while(tp) be[str[tp--]]=idx;
sort(q+1,q+1+cntq,cmp);
tim=0;
int u=1,v=1;
updata(1);
for(int i=1;i<=cntq;i++){
if(tim<q[i].t){
modify(c[tim+1].u,c[tim+1].next);
++tim;
}
if(tim>q[i].t){
modify(c[tim].u,c[tim].last);
--tim;
}
updata(lca(u,v));
if(u!=q[i].u){
move(u,q[i].u);
u=q[i].u;
}
if(v!=q[i].v){
move(v,q[i].v);
v=q[i].v;
}
updata(lca(u,v));
ans[q[i].id]=res;
}
for(int i=1;i<=cntq;i++) printf("%lld\n",ans[i]);
return 0;
}