比赛 期末考试1 评测结果 AAAAAAAAAA
题目名称 Output Only 最终得分 100
用户昵称 rzzakioi 运行时间 1.023 s
代码语言 C++ 内存使用 5.12 MiB
提交时间 2026-02-08 09:40:48
显示代码纯文本
#include<cstdio>
using namespace std;
int n,k,q,c[200005],p[200005],ans;
int to[400005],nxt[400005],h[400005],cnt;
void add(int u,int v){
    to[++cnt]=v;
    nxt[cnt]=h[u];
    h[u]=cnt;
}
void dfs(int u,int fa){
    p[u]=p[fa];
    int num=k-(c[u]+p[u])%k;
    p[u]=(p[u]+num)%k;
    if(p[u]!=p[fa])ans++;
    for(int i=h[u];i;i=nxt[i]){
        int v=to[i];
        if(v==fa)continue;
        dfs(v,u);
    }
}
int solve(int u,int x){
    int num=0;
    for(int i=h[u];i;i=nxt[i]){
        int v=to[i];
        if(c[u]==c[v])num++;
        if(x==c[v])num--;
    }
    if(u==1&&c[u]!=0&&x==0)num--;
    if(u==1&&c[u]==0&&x!=0)num++;
    return num;
}
int main(){
    freopen("tioj_outplay.in","r",stdin);
    freopen("tioj_outplay.out","w",stdout);
    scanf("%d%d%d",&n,&k,&q);
    for(int i=1;i<=n;i++){
        scanf("%d",&c[i]);
    }
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    dfs(1,0);
    for(int i=1;i<=q;i++){
        int w,x;
        scanf("%d%d",&w,&x);
        ans+=solve(w,x);
        printf("%d\n",ans);
        c[w]=x;
    }
    return 0;
}