| 比赛 |
期末考试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;
}