Submission #377501

#TimeUsernameProblemLanguageResultExecution timeMemory
377501dolphingarlicDynamic Diameter (CEOI19_diameter)C++14
49 / 100
5063 ms35176 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; ll edge[100001], dp[100001], to_par[100001]; vector<pair<int, int>> graph[100001]; int par[100001], upper[100001], lower[100001]; multiset<ll> ms[100001], all; void dfs(int node = 1, int parent = 0) { par[node] = parent; ms[node].insert(0); for (pair<int, int> i : graph[node]) if (i.first != parent) { upper[i.second] = node, lower[i.second] = i.first; to_par[i.first] = i.second; dfs(i.first, node); ms[node].insert(dp[i.first] + edge[i.second]); } dp[node] = *ms[node].rbegin(); all.insert(dp[node] + *next(ms[node].rbegin())); } void propagate(int node, ll prv, ll curr) { if (prv == curr) return; ll par_prv = dp[node] + edge[to_par[node]]; all.erase(all.find(dp[node] + *next(ms[node].rbegin()))); ms[node].erase(ms[node].find(prv)); ms[node].insert(curr); dp[node] = *ms[node].rbegin(); all.insert(dp[node] + *next(ms[node].rbegin())); ll par_curr = dp[node] + edge[to_par[node]]; if (par[node]) propagate(par[node], par_prv, par_curr); } int main() { cin.tie(0)->sync_with_stdio(0); int n, q; ll w; cin >> n >> q >> w; for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v >> edge[i]; graph[u].push_back({v, i}); graph[v].push_back({u, i}); } dfs(); ll last = 0; while (q--) { int d; ll e; cin >> d >> e; d = (d + last) % (n - 1); e = (e + last) % w; propagate(upper[d], dp[lower[d]] + edge[d], dp[lower[d]] + e); edge[d] = e; last = *all.rbegin(); cout << last << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...