General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
57709996 Practice:
py_ultron
1172E - 24 GNU C++11 Accepted 3353 ms 88036 KB 2019-07-25 01:59:59 2019-07-25 01:59:59
→ Source
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;typedef long long ll;const int maxn=400010;struct Node{int t,u,o;};int n,m,c[maxn],fa[maxn],sz[maxn],vsz[maxn],ch[maxn][2],pa[maxn];ll sz2[maxn],vsz2[maxn],ans[maxn];vector<int>E[maxn];vector<Node>eve[maxn];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(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&c[i]);for(int i=1,u,v;i<n;i++){scanf("%d%d",&u,&v);E[u].push_back(v),E[v].push_back(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]].push_back((Node){0,i,0});int u,x;for(int i=1;i<=m;i++){scanf("%d%d",&u,&x);eve[c[u]].push_back((Node){i,u,1});eve[c[u]=x].push_back((Node){i,u,0});}for(int i=1;i<=n;i++)eve[c[i]].push_back((Node){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++)printf("%lld\n",ans[i]);return 0;}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details