Submission #689725

#TimeUsernameProblemLanguageResultExecution timeMemory
689725overwatch9Dynamic Diameter (CEOI19_diameter)C++17
24 / 100
1166 ms2056 KiB
// subtask12 #include <iostream> #include <vector> #include <algorithm> using namespace std; using ll = long long; const int MAX_N = 5000 + 1; vector <pair <int, ll>> adj[MAX_N]; struct edge { int a, b; ll w; }; edge edges[MAX_N]; int node; ll max_dis; int N, Q; ll W; void dfs(int s, int p, ll dis) { if (dis > max_dis) { node = s; max_dis = dis; } for (auto i : adj[s]) { if (i.first == p) continue; dfs(i.first, s, dis + i.second); } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> N >> Q >> W; for (int i = 0; i < N-1; i++) { int a, b; ll w; cin >> a >> b >> w; adj[a].push_back({b, w}); adj[b].push_back({a, w}); edge tp; tp.a = a; tp.b = b; tp.w = w; edges[i] = tp; } for (int i = 1; i <= N; i++) sort(adj[i].begin(), adj[i].end()); ll last = 0; while (Q--) { ll d; ll e; cin >> d >> e; d = (d + last) % (N-1); e = (e + last) % (W); int a = edges[d].a, b = edges[d].b; pair <int, ll> tp = {b, 0}; auto x = lower_bound(adj[a].begin(), adj[a].end(), tp); x->second = e; tp = {a, 0}; x = lower_bound(adj[b].begin(), adj[b].end(), tp); x->second = e; edges[d].w = e; max_dis = 0; dfs(1, 1, 0); max_dis = 0; dfs(node, node, 0); last = max_dis; cout << max_dis << '\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...