제출 #1225843

#제출 시각아이디문제언어결과실행 시간메모리
1225843Muhammad_AneeqArboras (RMI20_arboras)C++20
0 / 100
5088 ms24592 KiB
#include <iostream> #include <vector> #include <set> #include <algorithm> using namespace std; #define int long long int const N=1e5+10,mod=1e9+7; vector<int>nei[N]={}; multiset<int>s[N]; int dp[N],P[N],W[N],ans[N]; int Ans=0; void dfs(int u) { dp[u]=0; s[u].insert(0); for (auto i:nei[u]) { if (i==P[u]) continue; dfs(i); s[u].insert(dp[i]+W[i]); ans[u]+=dp[u]+W[i]; ans[u]%=mod; } Ans=(Ans+ans[u])%mod; if (s[u].size()) dp[u]=*rbegin(s[u]); } inline void solve() { int n; cin>>n; P[0]=-1; for (int i=1;i<n;i++) cin>>P[i]; for (int i=1;i<n;i++) { cin>>W[i]; nei[P[i]].push_back(i); } dfs(0); cout<<Ans<<endl; int q; cin>>q; while (q--) { int v,ad; cin>>v>>ad; vector<int>ind; while (v!=-1) { ind.push_back(v); v=P[v]; } int sz=ind.size(); reverse(begin(ind),end(ind)); for (int i=0;i+1<sz;i++) { Ans=(Ans-ans[ind[i]]+mod)%mod; s[ind[i]].erase(s[ind[i]].find(dp[ind[i+1]]+W[ind[i+1]])); ans[ind[i]]-=dp[ind[i+1]]+W[ind[i+1]]; ans[ind[i]]=(ans[ind[i]]+mod)%mod; } reverse(begin(ind),end(ind)); W[ind[0]]+=ad; for (int i=1;i<sz;i++) { s[ind[i]].insert(dp[ind[i-1]]+W[ind[i-1]]); ans[ind[i]]+=dp[ind[i-1]]+W[ind[i-1]]; ans[ind[i]]%=mod; dp[ind[i]]=*rbegin(s[ind[i]]); Ans+=ans[ind[i]]; Ans%=mod; } cout<<(Ans+mod)%mod<<endl; } } signed main() { ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); int t=1; for (int i=1;i<=t;i++) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...