General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
252031688 Practice:
Yuvraj_2004
1172E - 24 C++17 (GCC 7-32) Accepted 3073 ms 66752 KB 2024-03-18 09:14:36 2024-03-18 09:14:36
→ Source
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
using namespace std;
const int N=4e5+5;
int n,m,res[N],col[N],fa[N],sz[N],sz2[N],tfa[N],son[N][2];
ll ss[N],ans[N];vector<int>G[N];vector<pair<int,int>>Do[N];
inline int get(int x){return son[fa[x]][1]==x;}
inline bool isroot(int x){return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;}
#define ls son[x][0]
#define rs son[x][1]
inline void pushup(int x){sz[x]=sz[ls]+sz[rs]+1+sz2[x];}
inline void rotate(int x){
	int y=fa[x],z=fa[y],k=get(x);
	if(!isroot(y))son[z][get(y)]=x;fa[x]=z;
	son[y][k]=son[x][k^1],fa[son[x][k^1]]=y;
	son[x][k^1]=y,fa[y]=x;pushup(y),pushup(x);	
}
inline void splay(int x){
	while(!isroot(x)){
		int y=fa[x];
		if(!isroot(y))get(x)^get(y)?rotate(x):rotate(y);
		rotate(x);
	}
}
#undef ls
#undef rs
inline void access(int x){
	for(int y=0;x;x=fa[y=x]){
		splay(x);
		sz2[x]+=sz[son[x][1]]-sz[y];
		ss[x]+=(ll)sz[son[x][1]]*sz[son[x][1]]-(ll)sz[y]*sz[y];
		son[x][1]=y,pushup(x);
	}
}
inline int findroot(int x){
	access(x),splay(x);
	while(son[x][0])x=son[x][0];
	return splay(x),x;
}
inline void link(int x,int y){
	splay(x),access(y),splay(y);
	fa[x]=y,sz2[y]+=sz[x],ss[y]+=(ll)sz[x]*sz[x],pushup(y);
}
inline void cut(int x,int y){
	access(x),splay(y),fa[x]=son[y][1]=0,pushup(y);
}
inline int ask(int x){
	int rt=findroot(x);splay(rt);
	return sz[rt]-sz2[rt]-1;
}
inline ll REV(int x){
	ll ans=0;
	if(res[x]){
		int c=ask(x);ans-=(ll)c*c;cut(x,tfa[x]),
		access(x),c=ask(tfa[x]),ans+=ss[x]+(ll)c*c;
	}else{
		access(x);int c=ask(tfa[x]);ans-=ss[x]+(ll)c*c;
		link(x,tfa[x]),c=ask(x),ans+=(ll)c*c;
	}return res[x]^=1,ans;
}
inline void solve(vector<pair<int,int>>&vec){
	for(auto x:vec)ans[x.se]+=REV(x.fi);
	for(auto x:vec)if(!res[x.fi])REV(x.fi);
}
inline void dfs(int x){
	sz[x]=res[x]=1;
	for(auto y:G[x])if(y^tfa[x])tfa[y]=x,dfs(y);
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	ll sum=ans[0]=(ll)n*n*n;
	rep(i,1,n)cin>>col[i],Do[col[i]].eb(i,0);
	rep(i,2,n){
		int u,v;cin>>u>>v;
		G[u].eb(v),G[v].eb(u);
	}
	dfs(1);
	rep(i,2,n)link(i,tfa[i]);link(1,tfa[1]=n+1);
	rep(i,1,m){
		int u,w;cin>>u>>w;
		Do[col[u]].eb(u,i),Do[col[u]=w].eb(u,i);
	}
	rep(i,1,n)solve(Do[i]);
	cout<<sum-ans[0]<<'\n';
	rep(i,1,m)cout<<sum-(ans[i]+=ans[i-1])<<'\n';
	return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details