样例没过,应该是修改操作的问题。
代码:
#include<bits/stdc++.h>
#ifdef WIN32
#define getc() getchar()
#else
#define getc() getchar_unlocked()
#endif
#define N 100005
using namespace std;
using lli=long long int;
struct query{
int l,r,t,id;
}q1[N];
struct update{
int p,c;
}q2[N];
int n,m,q,B,len,qcnt,rcnt;
int v[N],w[N],c[N],a[N<<1],f[N],g[N],fa[N][25],dep[N],cnt[N];
lli sum,ans[N];
vector<int>s[N];
bitset<N<<1>vis;
void read(int &n){
n=0;bool neg=false;
char c=getc();
while(c<'0'||c>'9') neg^=c=='-',c=getc();
while(c>='0'&&c<='9') n=(n<<1)+(n<<3)+(c^48),c=getc();
n=neg?-n:n;
}
void print(lli x){
if(!x) return putchar('0'),void();
if(x<0) putchar('-'),x=-x;
int top=0,a[20];
while(x) a[top++]=x%10,x/=10;
while(top) putchar(a[--top]+'0');
}
void dfs(int x,int fafa){
a[f[x]=++len]=x,dep[x]=dep[fafa]+1;
for(auto p:s[x]){
if(p==fafa) continue;
fa[p][0]=x,dfs(p,x);
}
a[g[x]=++len]=x;
}
int LCA(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
if(dep[x]!=dep[y])
for(int i=20;i>=0;i--){
int v=fa[x][i];
if(dep[v]>=dep[y]) x=v;
}
if(x==y) return x;
for(int i=20;i>=0;i--){
int vx=fa[x][i],vy=fa[y][i];
if(vx!=vy) x=vx,y=vy;
}
return fa[x][0];
}
void sol(int x){
if(vis[x]) sum-=1ll*v[c[x]]*w[cnt[c[x]]--];
else sum+=1ll*v[c[x]]*w[++cnt[c[x]]];
vis[x]=!vis[x];
}
bool cmp(query x,query y){
if(x.l/B^y.l/B) return x.l<y.l;
if(x.r/B^y.r/B) return (x.l/B&1)?x.r<y.r:x.r>y.r;
return x.t<y.t;
}
int main(){
read(n),read(m),read(q),B=ceil(pow(n<<1,2.0/3));
for(int i=1;i<=m;i++) read(v[i]);
for(int i=1;i<=n;i++) read(w[i]);
for(int i=1,a,b;i<n;i++){
read(a),read(b);
s[a].push_back(b);
s[b].push_back(a);
}
for(int i=1;i<=n;i++) read(c[i]);
dfs(1,0);
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)
fa[i][j]=fa[fa[i][j-1]][j-1];
for(int i=1,Type,x,y;i<=q;i++){
read(Type),read(x),read(y);
if(!Type) q2[++rcnt]={x,y};
else{
if(f[x]>f[y]) swap(x,y);
q1[++qcnt]={LCA(x,y)==x?f[x]:g[x],f[y],rcnt,qcnt};
}
}
sort(q1+1,q1+qcnt+1,cmp);
for(int i=1,l=1,r=0,t=0;i<=qcnt;i++){
auto p=q1[i];
while(t<p.t){
t++;
int u=q2[t].p;
if(vis[u]) sol(u);
swap(c[u],q2[t].c);
if(vis[u]) sol(u);
}
while(t>p.t){
int u=q2[t].p;
if(vis[u]) sol(u);
swap(c[u],q2[t].c);
if(vis[u]) sol(u);
t--;
}
while(l>p.l) sol(a[--l]);
while(r<p.r) sol(a[++r]);
while(l<p.l) sol(a[l++]);
while(r>p.r) sol(a[r--]);
int u=a[l],v=a[r],lca=LCA(u,v);
if(u!=lca&&v!=lca) sol(lca);
ans[p.id]=sum;
if(u!=lca&&v!=lca) sol(lca);
}
for(int i=1;i<=qcnt;i++) print(ans[i]),puts("");
return 0;
}