Submission #1276560

#TimeUsernameProblemLanguageResultExecution timeMemory
1276560MisterReaperDynamic Diameter (CEOI19_diameter)C++20
49 / 100
5088 ms31188 KiB
// File diameter.cpp created on 06.10.2025 at 09:23:46 #include <bits/stdc++.h> using i64 = long long; #ifdef DEBUG #include "/home/ahmetalp/Desktop/Workplace/debug.h" #else #define debug(...) void(23) #endif int N, Q; i64 W; std::vector<i64> C; std::vector<std::array<int, 2>> E; std::vector<std::vector<int>> adj; std::vector<int> par, epar; std::vector<std::multiset<i64>> vals; std::multiset<i64> overall; i64 get_max(std::multiset<i64>& mset) { if (mset.empty()) { return 0; } return *mset.rbegin(); } i64 cost(std::multiset<i64>& mset) { if (mset.empty()) { return 0; } if (mset.size() == 1) { return *mset.rbegin(); } return *mset.rbegin() + *++mset.rbegin(); } void dfs(int v) { vals[v].emplace(0); for (auto i : adj[v]) { int u = E[i][0] ^ E[i][1] ^ v; adj[u].erase(std::find(adj[u].begin(), adj[u].end(), i)); par[u] = v; epar[u] = i; dfs(u); vals[v].emplace(get_max(vals[u]) + C[i]); } overall.emplace(cost(vals[v])); } void del(int v) { std::vector<int> p {v}; while (v != 0) { v = par[v]; p.emplace_back(v); } std::reverse(p.begin(), p.end()); for (int i = 0; i < int(p.size()); ++i) { int v = p[i]; overall.extract(cost(vals[v])); if (i + 1 == int(p.size())) { vals[v].extract(0); } else { int u = p[i + 1]; vals[v].extract(get_max(vals[u]) + C[epar[u]]); } } } void add(int v) { std::vector<int> p {v}; while (v != 0) { v = par[v]; p.emplace_back(v); } vals[v].emplace(0); for (int i = 0; i < int(p.size()); ++i) { int v = p[i]; overall.emplace(cost(vals[v])); if (i + 1 != int(p.size())) { int u = p[i + 1]; vals[u].emplace(get_max(vals[v]) + C[epar[v]]); } } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cin >> N >> Q >> W; adj.resize(N); par.resize(N, -1); epar.resize(N, -1); E.resize(N - 1); C.resize(N - 1); vals.resize(N); for (int i = 0; i < N - 1; ++i) { std::cin >> E[i][0] >> E[i][1] >> C[i]; --E[i][0], --E[i][1]; adj[E[i][0]].emplace_back(i); adj[E[i][1]].emplace_back(i); } dfs(0); i64 last = 0; while (Q--) { int I; i64 X; std::cin >> I >> X; I = (I + last) % (N - 1); X = (X + last) % W; auto[u, v] = E[I]; if (par[u] == v) { std::swap(u, v); } del(v); C[I] = X; add(v); last = get_max(overall); std::cout << last << '\n'; } return 0; }
#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...