#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 100001
typedef long long ll;
int v[N<<1],en,first[N],next[N<<1];
void AddEdge(int U,int V)
{
v[++en]=V;
next[en]=first[U];
first[U]=en;
}
int n,m,a[N],b[N];
int eq,ec,blo,sz,siz[N],top[N],fa[N],dep[N],num[N];
void dfs(int U)
{
for(int i=first[U];i;i=next[i])
if(v[i]!=fa[U])
{
fa[v[i]]=U;
dep[v[i]]=dep[U]+1;
if(siz[top[U]]<sz)
{
++siz[top[U]];
top[v[i]]=top[U];
}
dfs(v[i]);
}
}
void df2(int U)
{
num[U]=blo;
for(int i=first[U];i;i=next[i])
if(v[i]!=fa[U]&&top[v[i]]==top[U])
df2(v[i]);
}
int lca(int U,int V)
{
while(U!=V)
{
if(top[U]!=top[V])
{
if(dep[top[U]]<dep[top[V]])
swap(U,V);
U=fa[top[U]];
}
else
{
if(dep[U]<dep[V])
swap(U,V);
U=fa[U];
}
}
return U;
}
struct UPT{int x,y,z;}CH[N];
struct ASK{int l,r,p,t;}Q[N];
bool operator < (const ASK &a,const ASK &b)
{
if(num[a.l]==num[b.l])
{
if(num[a.r]==num[b.r])
return a.t<b.t;
return num[a.r]<num[b.r];
}
return num[a.l]<num[b.l];
}
ll anss[N],ans;
int Vs[N],Ws[N],q;
bool vis[N];
int T[N];
void Update(int x,int op)
{
if(op==-1) ans-=(ll)Vs[x]*(ll)Ws[T[x]];
T[x]+=op;
if(op==1) ans+=(ll)Vs[x]*(ll)Ws[T[x]];
}
void Work(int U,int V,int LCA)
{
while(U!=LCA)
{
vis[U]^=1;
Update(a[U],vis[U]?1:-1);
U=fa[U];
}
while(V!=LCA)
{
vis[V]^=1;
Update(a[V],vis[V]?1:-1);
V=fa[V];
}
}
int main()
{
int x,y; bool op;
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=m;++i) scanf("%d",&Vs[i]);
for(int i=1;i<=n;++i) scanf("%d",&Ws[i]);
for(int i=1;i<n;++i)
{
scanf("%d%d",&x,&y);
AddEdge(x,y);
AddEdge(y,x);
}
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
{
top[i]=i;
siz[i]=1;
}
sz=(int)pow((double)n,2.0/3.0);
dfs(1);
for(int i=1;i<=n;++i)
if(top[i]==i)
{
++blo;
df2(i);
}
en=n;
memcpy(b,a,sizeof(int)*(n+1));
for(int i=1;i<=q;++i)
{
scanf("%d",&op);
if(!op)
{
++ec; ++en;
scanf("%d%d",&CH[ec].x,&CH[ec].y);
CH[ec].z=b[CH[ec].x];
b[CH[ec].x]=CH[ec].y;
}
else
{
++eq;
scanf("%d%d",&Q[eq].l,&Q[eq].r);
Q[eq].t=ec; Q[eq].p=eq;
}
}
sort(Q+1,Q+eq+1);
for(int i=1;i<=Q[1].t;++i)
a[CH[i].x]=CH[i].y;
int LCA=lca(Q[1].l,Q[1].r);
Work(Q[1].l,Q[1].r,LCA);
Update(a[LCA],1);
anss[Q[1].p]=ans;
Update(a[LCA],-1);
for(int i=2;i<=eq;++i)
{
if(Q[i-1].t<Q[i].t) for(int j=Q[i-1].t+1;j<=Q[i].t;++j)
{
if(vis[CH[j].x])
{
Update(CH[j].y,1);
Update(a[CH[j].x],-1);
}
a[CH[j].x]=CH[j].y;
}
else for(int j=Q[i-1].t;j>Q[i].t;--j)
{
if(vis[CH[j].x])
{
Update(CH[j].z,1);
Update(a[CH[j].x],-1);
}
a[CH[j].x]=CH[j].z;
}
Work(Q[i-1].l,Q[i].l,lca(Q[i-1].l,Q[i].l));
Work(Q[i-1].r,Q[i].r,lca(Q[i-1].r,Q[i].r));
LCA=lca(Q[i].l,Q[i].r);
Update(a[LCA],1);
anss[Q[i].p]=ans;
Update(a[LCA],-1);
}
for(int i=1;i<=eq;++i)
printf("%lld\n",anss[i]);
return 0;
}

最新文章

  1. Sublime text 2/3 中 Package Control 的安装与使用方法
  2. 山东省第七届ACM省赛------Triple Nim
  3. asp.net LINQ实现数据分页
  4. Unity将来时:IL2CPP是什么?
  5. 西部数据出现“WD SES Device USB Device”怎么办,而且说明书全是英文。
  6. jsp-javabean练习1
  7. UVa 10801 - Lift Hopping(dijkstra最短路)
  8. 浅谈SQL语句优化经验
  9. NodeJS加MongoDB应用入门
  10. IOS多线程的小总结
  11. KEIL中的一些细节
  12. 挖个坑,写一个Spring+SpringMVC+Mybatis的项目
  13. Life in Changsha 第二次scrum冲刺
  14. java实现微信支付之扫码支付
  15. pd16.5增加字段备注
  16. 实验3 敏捷开发与XP实践实验报告
  17. 认识Charles-proxy 抓包工具
  18. 解决Android SDK下载和更新失败问题
  19. keycloak docker-compose 运行
  20. SSIS组件——Merge、Merge Join、Union All

热门文章

  1. Spring源码解析-基于注解依赖注入
  2. ViBe(Visual Background extractor)背景建模或前景检测
  3. springboot搭建web项目(转)
  4. hive对有特殊值null的数据倾斜处理
  5. hbase vs mongodb
  6. 动态性能视图v$session_longops
  7. hibernate连接mysql,自动建表失败
  8. 设置eclipse控制台上的信息输入到某个文件
  9. oracle 数据库图形化工具 sqldeveloper
  10. 扑克牌(cards)