树上带修莫队模板题
#include<bits/stdc++.h>
const int N=;
typedef long long i64;
char buf[N*],*ptr=buf-,ob[N*],*op=ob;
int _(){
int x=;
while(*ptr<)++ptr;
while(*ptr>)x=x*+*ptr++-;
return x;
}
void pr(i64 x){
int ss[],sp=;
do ss[++sp]=x%+;while(x/=);
while(sp)*op++=ss[sp--];
*op++=;
}
void maxs(int&a,int b){if(a<b)a=b;}
int n,m,q;
std::vector<int>e[N];
int v1[N],v2[N],c[N];
int tk=;
int os[N][];
int X=,Y=,Z=,in[N];
int ts[N],dep[N],fa[N],sz[N],top[N],son[N],md[N],id[N],idp=,D=;
i64 ans=;
inline void del(int x){ans-=i64(v1[x])*v2[ts[x]--];}
inline void ins(int x){ans+=i64(v1[x])*v2[++ts[x]];}
void f2(int w){
id[w]=idp;
for(int i=;i<e[w].size();++i){
int u=e[w][i];
if(u!=fa[w]&&!id[u])f2(u);
}
}
void f3(int w,int tp){
top[w]=tp;
if(son[w])f3(son[w],tp);
for(int i=;i<e[w].size();++i){
int u=e[w][i];
if(u!=fa[w]&&u!=son[w])f3(u,u);
}
}
void f1(int w,int pa){
dep[w]=dep[fa[w]=pa]+;
sz[w]=;
for(int i=;i<e[w].size();++i){
int u=e[w][i];
if(u!=pa){
f1(u,w);
sz[w]+=sz[u];
if(sz[u]>sz[son[w]])son[w]=u;
if(!id[u])maxs(md[w],md[u]+);
}
}
if(w==||md[w]==D)++idp,f2(w);
}
int lca(int x,int y){
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]>dep[b])x=fa[a],a=top[x];
else y=fa[b],b=top[y];
}
return dep[x]<dep[y]?x:y;
}
i64 as[N];
struct Q{
int x,y,z,ID;
bool operator<(const Q&w)const{
if(id[x]!=id[w.x])return id[x]<id[w.x];
if(id[y]!=id[w.y])return (id[y]<id[w.y])^(id[x]&);
return z<w.z;
}
void mov(int&w0,int b){
int a=w0;w0=b;
int g=lca(a,b);
for(;a!=g;a=fa[a])(in[a]^=)?ins(c[a]):del(c[a]);
for(;b!=g;b=fa[b])(in[b]^=)?ins(c[b]):del(c[b]);
}
void cal(){
int w;
while(Z<z){
++Z;
if(in[w=os[Z][]]){
del(c[w]);
ins(c[w]=os[Z][]);
}
c[w]=os[Z][];
}
while(Z>z){
if(in[w=os[Z][]]){
del(c[w]);
ins(os[Z][]);
}
c[w]=os[Z][];
--Z;
}
mov(X,x);
mov(Y,y);
int g=lca(x,y);
ins(c[g]);
as[ID]=ans;
del(c[g]);
}
}qs[N];
int qp=;
int main(){
fread(buf,,sizeof(buf),stdin);
n=_();m=_();q=_();
for(int i=;i<=m;++i)v1[i]=_();
for(int i=;i<=n;++i)v2[i]=_();
for(int i=,a,b;i<n;++i){
a=_(),b=_();
e[a].push_back(b);
e[b].push_back(a);
}
for(int i=;i<=n;++i)c[i]=_();
for(int i=;i<q;++i){
int o=_(),x=_(),y=_();
if(o)qs[qp]=(Q){x,y,tk,qp},++qp;
else{
++tk;
os[tk][]=x;
os[tk][]=c[x];
os[tk][]=c[x]=y;
}
}
if(tk<=)D=sqrt(n)+;
else D=pow(n,0.67)+;
f1(,);f3(,);
std::sort(qs,qs+qp);
X=Y=,Z=tk;
for(int i=;i<qp;++i)qs[i].cal();
for(int i=;i<qp;++i)pr(as[i]);
fwrite(ob,,op-ob,stdout);
return ;
}