记录编号 458004 评测结果 AAAAAAAAAA
题目名称 [WC 2013] 糖果公园 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 C++ 运行时间 19.154 s
提交时间 2017-10-09 21:48:10 内存使用 12.52 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define v e[i].to
#define ll long long
using namespace std;
const int ma=100005;
int n,m,Q,fi[ma],tot,w[ma],dfn[ma<<1],cnt[ma],h[ma],c[ma],ans[ma],pos[ma<<1],o1,o2,st[ma],ed[ma],temp[ma];
int siz[ma],top[ma],fa[ma],son[ma],dep[ma];
struct edge{
	int to,next;
}e[ma<<1];
void edge_add(int x,int y){
	e[++tot].to=y;
	e[tot].next=fi[x];
	fi[x]=tot;
}
struct Ques{
	int l,r,tim,id,lc;ll ans;
	bool operator < (const Ques&o)const{
		if(pos[l]!=pos[o.l])return l<o.l;
		if(pos[r]!=pos[o.r])return r<o.r;
		return tim<o.tim;
	}
}q[ma];
struct Change{
	int id,from,to;
}change[ma];
void dfs1(int x){
	dfn[++tot]=x;st[x]=tot;
	for(int i=fi[x];i;i=e[i].next){
		if(fa[x]==v)continue;
		fa[v]=x;dep[v]=dep[x]+1;
		dfs1(v);siz[x]+=siz[v];
		if(siz[v]>siz[son[x]])son[x]=v;
	}dfn[++tot]=x;ed[x]=tot;
}
void dfs2(int x,int y){
	top[x]=y;
	if(son[x])dfs2(son[x],y);
	for(int i=fi[x];i;i=e[i].next){
		if(top[v])continue;
		dfs2(v,v);
	}
}
int get_lca(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		x=fa[top[x]];
	}return dep[x]<dep[y]?x:y;
}
bool cmp(Ques x,Ques y){
	return x.id<y.id;
}
int read(){
	char ch=getchar();
	int a=0;
	while(!(ch<='9'&&ch>='0'))ch=getchar();
	while(ch<='9'&&ch>='0'){
		a=(a<<1)+(a<<3)+('0'^ch);
		ch=getchar();
	}return a;
}
int main()
{
	int __size__ = 128<<20;
	char *__ptr__ = (char *)malloc(__size__)+__size__;
	__asm__("movl %0, %%esp\n"::"r"(__ptr__));
	freopen("park.in","r",stdin);freopen("park.out","w",stdout);
	n=read(),m=read(),Q=read();
	for(int i=1;i<=m;i++)h[i]=read();
	for(int i=1;i<=n;i++)w[i]=read();
	for(int i=1;i<n;i++){
		int x,y;x=read();y=read();
		edge_add(x,y);edge_add(y,x);
	}tot=0;
	for(int i=1;i<=n;i++)c[i]=read(),temp[i]=c[i],siz[i]=1;
	dfs1(1);dfs2(1,1);
	int len=5000;
	for(int i=1;i<=tot;i++)pos[i]=(i-1)/len+1;
	for(int i=1;i<=Q;i++){
		int t,x,y;t=read();x=read();y=read();
		if(t){
			if(st[x]>st[y])swap(x,y);
			int lc=get_lca(x,y);q[++o1].id=o1;
			if(lc!=x)q[o1].l=ed[x],q[o1].r=st[y],q[o1].tim=o2,q[o1].lc=lc;
			else q[o1].l=st[x],q[o1].r=st[y],q[o1].tim=o2;
		}
		else{
			change[++o2].id=x;change[o2].from=temp[x];change[o2].to=y;temp[x]=y;
		}
	}sort(q+1,q+o1+1);
	int l=1,r=0,t=0;ll now=0;
	for(int i=1;i<=o1;i++){
		while(t<q[i].tim){
			t++;
			if(cnt[change[t].id]&1){
				++ans[change[t].to];
				now+=(ll)w[ans[change[t].to]]*(ll)h[change[t].to];
				now-=(ll)w[ans[change[t].from]]*(ll)h[change[t].from];
				ans[change[t].from]--;
			}c[change[t].id]=change[t].to;
		}
		while(t>q[i].tim){
			if(cnt[change[t].id]&1){
				++ans[change[t].from];
				now+=(ll)w[ans[change[t].from]]*(ll)h[change[t].from];
				now-=(ll)w[ans[change[t].to]]*(ll)h[change[t].to];
				ans[change[t].to]--;
			}c[change[t].id]=change[t].from;t--;
		}
		while(l<q[i].l){
			cnt[dfn[l]]--;
			if(cnt[dfn[l]]&1)ans[c[dfn[l]]]++,now+=(ll)w[ans[c[dfn[l]]]]*(ll)h[c[dfn[l]]];
			else now-=(ll)w[ans[c[dfn[l]]]]*(ll)h[c[dfn[l]]],ans[c[dfn[l]]]--;
			l++;
		}
		while(l>q[i].l){
			l--;cnt[dfn[l]]++;
			if(cnt[dfn[l]]&1)ans[c[dfn[l]]]++,now+=(ll)w[ans[c[dfn[l]]]]*(ll)h[c[dfn[l]]];
			else now-=(ll)w[ans[c[dfn[l]]]]*(ll)h[c[dfn[l]]],ans[c[dfn[l]]]--;
		}
		while(r<q[i].r){
			r++;cnt[dfn[r]]++;
			if(cnt[dfn[r]]&1)ans[c[dfn[r]]]++,now+=(ll)w[ans[c[dfn[r]]]]*(ll)h[c[dfn[r]]];
			else now-=(ll)w[ans[c[dfn[r]]]]*(ll)h[c[dfn[r]]],ans[c[dfn[r]]]--;
		}
		while(r>q[i].r){
			cnt[dfn[r]]--;
			if(cnt[dfn[r]]&1)ans[c[dfn[r]]]++,now+=(ll)w[ans[c[dfn[r]]]]*(ll)h[c[dfn[r]]];
			else now-=(ll)w[ans[c[dfn[r]]]]*(ll)h[c[dfn[r]]],ans[c[dfn[r]]]--;
			r--;
		}
		q[i].ans=now+(ll)h[c[q[i].lc]]*(ll)w[ans[c[q[i].lc]]+1];
	}
	sort(q+1,q+o1+1,cmp);
	for(int i=1;i<=o1;i++)printf("%lld\n",q[i].ans);
	return 0;
}