(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #841727

#TimeUsernameProblemLanguageResultExecution timeMemory
841727hoanghq2004Dynamic Diameter (CEOI19_diameter)C++17
100 / 100
247 ms51680 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int n, q; vector <pair <int, long long>> g[N]; int a[N], in[N], out[N], ti, euler[N * 3]; long long d[N]; void dfs(int u, int p) { in[u] = ++ti; euler[ti] = u; for (auto [v, w]: g[u]) { if (v == p) continue; d[v] = d[u] + w; dfs(v, u); euler[++ti] = u; } out[u] = ti; } struct node { long long mx, mn; long long uw, wv; long long uwv; long long lazy; node operator + (const node& other) const { node ret; ret.mn = min(mn, other.mn); ret.mx = max(mx, other.mx); ret.uw = max({uw, other.uw, mx - 2 * other.mn}); ret.wv = max({wv, other.wv, other.mx - 2 * mn}); ret.uwv = max({uwv, other.uwv, uw + other.mx, other.wv + mx}); ret.lazy = 0; return ret; } } st[N * 12]; void push(int id, long long delta) { st[id].mx += delta; st[id].mn += delta; st[id].uw -= delta; st[id].wv -= delta; st[id].lazy += delta; } void build(int id, int L, int R) { if (L == R) { st[id].mx = st[id].mn = d[euler[L]]; st[id].uw = st[id].wv = - d[euler[L]]; st[id].uwv = st[id].lazy = 0; return; } int mid = L + R >> 1; build(id * 2, L, mid); build(id * 2 + 1, mid + 1, R); st[id] = st[id * 2] + st[id * 2 + 1]; } void add(int id, int L, int R, int u, int v, long long delta) { if (u > R || L > v) return; if (u <= L && R <= v) { push(id, delta); return; } if (st[id].lazy) { push(id * 2, st[id].lazy); push(id * 2 + 1, st[id].lazy); st[id].lazy = 0; } int mid = L + R >> 1; add(id * 2, L, mid, u, v, delta); add(id * 2 + 1, mid + 1, R, u, v, delta); st[id] = st[id * 2] + st[id * 2 + 1]; } long long lambda, last; int main() { ios :: sync_with_stdio(0); cin.tie(0); cin >> n >> q >> lambda; vector <tuple <int, int, long long>> edges; for (int i = 1; i < n; ++i) { int u, v; long long w; cin >> u >> v >> w; g[u].push_back({v, w}); g[v].push_back({u, w}); edges.push_back({u, v, w}); } dfs(1, 0); build(1, 1, ti); while (q--) { int i; long long w; cin >> i >> w; i = (last + i) % (n - 1); w = (last + w) % lambda; auto &[u, v, _w] = edges[i]; if (in[u] > in[v]) swap(u, v); add(1, 1, ti, in[v], out[v], w - _w); _w = w; last = st[1].uwv; cout << last << '\n'; } }

Compilation message (stderr)

diameter.cpp: In function 'void build(int, int, int)':
diameter.cpp:56:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   56 |     int mid = L + R >> 1;
      |               ~~^~~
diameter.cpp: In function 'void add(int, int, int, int, int, long long int)':
diameter.cpp:73:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   73 |     int mid = L + R >> 1;
      |               ~~^~~
#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...