比赛 期末考试1 评测结果 AAAAAAAAAA
题目名称 Output Only 最终得分 100
用户昵称 yyswys 运行时间 4.914 s
代码语言 C++ 内存使用 37.39 MiB
提交时间 2026-02-08 12:12:46
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+5;
ll n,mod,q;
ll val[N];
ll rem[N];
ll parent[N];
vector<ll> adj[N];
unordered_map<ll, ll> cnt_son[N];
ll res;
void dfs(ll u,ll f){
    parent[u]=f;
    for(ll v:adj[u]){
        if(v!=f) dfs(v,u);
    }
}
int main(){
    freopen("tioj_outplay.in","r",stdin);
    freopen("tioj_outplay.out","w",stdout);
    cin>>n>>mod>>q;
    for(int i(1);i<=n;++i){
        cin>>val[i];
        rem[i]=(mod-val[i]%mod)%mod;
    }
    for(int i(1);i<n;++i){
        ll u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dfs(1,0);
    for(int i(2);i<=n;++i){ 
        cnt_son[parent[i]][rem[i]]++;
    }
    for(int i(1);i<=n;++i) {
        ll p;
        if(i==1) p=rem[i];
        else p=(rem[i]-rem[parent[i]]+mod)%mod;
        if(p!=0) res++;
    }
    while(q--){
        ll node,new_val;
        cin>>node>>new_val;
        ll new_rem=(mod-new_val%mod)%mod;
        if(new_rem == rem[node]){
            cout<<res<<"\n";
            continue;
        }
        ll old_rem=rem[node];
        ll fa=parent[node];
        ll old_p,new_p;
        if(node==1){
            old_p=old_rem;
            new_p=new_rem;
        }else{
            old_p=(old_rem-rem[fa]+mod)%mod;
            new_p=(new_rem-rem[fa]+mod)%mod;
        }
        if(old_p!=0) res--;
        if(new_p!=0) res++;
        ll cnt_old=0,cnt_new=0;
        if(cnt_son[node].count(old_rem)) cnt_old=cnt_son[node][old_rem];
        if(cnt_son[node].count(new_rem)) cnt_new=cnt_son[node][new_rem];
        res+=(cnt_old-cnt_new);
        rem[node]=new_rem;
        if(node!=1){
            cnt_son[fa][old_rem]--;
            if(cnt_son[fa][old_rem]==0) cnt_son[fa].erase(old_rem);
            cnt_son[fa][new_rem]++;
        }
        cout<<res<<"\n";
    }
    return 0;
}