General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
56689319 Practice:
vjudge4
1172E - 24 GNU C++11 Accepted 3868 ms 88164 KB 2019-07-08 05:30:31 2019-07-08 05:30:31
→ Source
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
typedef vector<int> vi;
#define pb push_back
typedef long long ll;
 
int gi() {
	int x=0,o=1;char ch=getchar();
	while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if(ch=='-') o=-1,ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x*o;
}
 
struct dat { int t,u,o; };
 
int n,m,c[N],fa[N],sz[N],vsz[N],ch[N][2],pa[N];
ll sz2[N],vsz2[N],ans[N];
vi E[N];
vector<dat> eve[N];
 
void dfs(int u) {
	for(auto v:E[u]) if(v^pa[u]) pa[v]=u,dfs(v);
}
 
ll sqr(int x) {
	return 1ll*x*x;
}
 
void pushup(int x) {
	sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+vsz[x]+1;
	sz2[x]=vsz2[x]+sqr(sz[ch[x][0]])+sqr(sz[ch[x][1]]);
}
 
bool isroot(int x) {
	return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
}
 
void rotate(int x) {
	int y=fa[x],z=fa[y],w=ch[y][1]==x;
	if(!isroot(y)) ch[z][ch[z][1]==y]=x;
	ch[y][w]=ch[x][w^1];fa[ch[y][w]]=y;
	ch[x][w^1]=y;fa[y]=x;fa[x]=z;
	pushup(y);pushup(x);
}
 
void splay(int x) {
	while(!isroot(x)) {
		int y=fa[x],z=fa[y];
		if(!isroot(y)) (ch[y][0]==x)^(ch[z][0]==y)?rotate(x):rotate(y);
		rotate(x);
	}
}
 
void access(int x) {
	for(int t=0;x;t=x,x=fa[x]) {
		splay(x);
		vsz[x]+=sz[ch[x][1]];vsz2[x]+=sqr(sz[ch[x][1]]);
		ch[x][1]=t;
		vsz[x]-=sz[t];vsz2[x]-=sqr(sz[t]);
		pushup(x);
	}
}
 
int findroot(int x) {
	access(x);splay(x);while(ch[x][0]) x=ch[x][0]; splay(x); return x;
}
 
void link(int x,int ff) {
	access(ff);splay(ff);splay(x);vsz[ff]+=sz[x];vsz2[ff]+=sqr(sz[x]);fa[x]=ff;pushup(ff);
}
 
void cut(int x,int ff) {
	access(ff);splay(ff);splay(x);vsz[ff]-=sz[x];vsz2[ff]-=sqr(sz[x]);fa[x]=0;pushup(ff);
}
 
int main() {
#ifndef ONLINE_JUDGE
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
#endif
	cin>>n>>m;
	for(int i=1;i<=n;i++) c[i]=gi();
	for(int i=1,u,v;i<n;i++) u=gi(),v=gi(),E[u].pb(v),E[v].pb(u);
	dfs(1),pa[1]=n+1;
	for(int i=1;i<=n+1;i++) sz[i]=1;
	for(int i=1;i<=n;i++) link(i,pa[i]);
	for(int i=1;i<=n;i++) eve[c[i]].pb((dat){0,i,0});
	for(int i=1;i<=m;i++) {
		int u=gi(),x=gi();
		eve[c[u]].pb((dat){i,u,1});
		eve[c[u]=x].pb((dat){i,u,0});
	}
	for(int i=1;i<=n;i++) eve[c[i]].pb((dat){m+1,i,1});
	for(int i=1;i<=n;i++)
		for(auto x:eve[i]) {
			int t=x.t,u=x.u,ff=findroot(pa[u]);
			if(x.o) {
				splay(ff),splay(u),ans[t]+=sz2[ff]+sz2[u];
				link(u,pa[u]),splay(ff),ans[t]-=sz2[ff];
			}
			else {
				splay(ff),ans[t]+=sz2[ff],cut(u,pa[u]);
				splay(ff),splay(u),ans[t]-=sz2[ff]+sz2[u];
			}
		}
	for(int i=1;i<=m;i++) ans[i]+=ans[i-1];
	for(int i=0;i<=m;i++) cout<<ans[i]<<endl;
	return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details