比赛 期末考试1 评测结果 AAAAAAAAAA
题目名称 Output Only 最终得分 100
用户昵称 梦那边的美好ME 运行时间 2.077 s
代码语言 C++ 内存使用 38.22 MiB
提交时间 2026-02-08 10:02:41
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll n,k,Q,c[210000],b[210000],fa[210000];
vector<ll> g[210000];
unordered_map<ll,ll> cnt[210000];
ll ans;

void dfs(ll u,ll f){
    fa[u]=f;
    for (ll v:g[u]){
		if (v!=f) dfs(v,u);
	}
}

int main(){
    freopen("tioj_outplay.in","r",stdin);
    freopen("tioj_outplay.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>k>>Q;
    for (int i=1;i<=n;i++){
        cin>>c[i];
        b[i]=(k-c[i]%k)%k;
    }
    for (int i=1;i<n;i++){
        ll u,v;
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1,0);
    for (int i=2;i<=n;i++) cnt[fa[i]][b[i]]++;
    for (int i=1;i<=n;i++){
        ll p;
        if (i==1) p=b[i];
        else p=(b[i]-b[fa[i]]+k)%k;
        if (p) ans++;
    }
    while (Q--){
        ll w,x;
        cin>>w>>x;
        ll nb=(k-x%k)%k;
        if (nb==b[w]){
            cout<<ans<<'\n';
            continue;
        }
        ll ob=b[w];
        ll f=fa[w];
        ll op,np;
        if (w==1) op=ob,np=nb;
        else op=(ob-b[f]+k)%k,np=(nb-b[f]+k)%k;
        if (op) ans--;
        if (np) ans++;
        ll c1=0,c2=0;
        if (cnt[w].count(ob)) c1=cnt[w][ob];
        if (cnt[w].count(nb)) c2=cnt[w][nb];
        ans+=c1-c2;
        b[w]=nb;
        if (w!=1){
            cnt[f][ob]--;
            if (cnt[f][ob]==0) cnt[f].erase(ob);
            cnt[f][nb]++;
        }
        cout<<ans<<'\n';
    }
    return 0;
}