(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 #439709

#TimeUsernameProblemLanguageResultExecution timeMemory
439709prvocisloDynamic Diameter (CEOI19_diameter)C++17
100 / 100
752 ms49832 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; const int maxn = 1 << 17, maxv = maxn * 2; struct node { ll u, l, ul, lv, ulv, lazy; // premenne hovoria ze ktore vrcholy sme uz vybrali int li, ri; node() { u=l=ul=lv=ulv=lazy=0; } } t[maxv * 2]; void merge(node &a, const node &l, const node &r) { a.u = max(l.u, r.u), a.l = max(l.l, r.l); a.ul = max({l.ul, r.ul, l.u + r.l}); a.lv = max({l.lv, r.lv, l.l + r.u}); a.ulv = max({l.ulv, r.ulv, l.ul + r.u, l.u + r.lv}); } void add(node &a, ll x) { a.u += x, a.l -= 2 * x; a.ul -= x, a.lv -= x, a.lazy += x; } void unlazy(int vr) { add(t[vr * 2 + 1], t[vr].lazy), add(t[vr * 2 + 2], t[vr].lazy); t[vr].lazy = 0; } void update(int l, int r, ll x, int vr = 0) { if (l > t[vr].ri || r < t[vr].li) return; if (l <= t[vr].li && t[vr].ri <= r) return add(t[vr], x), void(); unlazy(vr); update(l, r, x, vr*2+1), update(l, r, x, vr*2+2); merge(t[vr], t[vr*2+1], t[vr*2+2]); } struct edge { int u, v; ll x; } e[maxn]; int tin[maxn], tout[maxn], p[maxn], timer = 0; ll last = 0; vector<int> g[maxn]; void dfs(int u) { tin[u] = timer++; for (int i : g[u]) { int v = u ^ e[i].u ^ e[i].v; if (v == p[u]) continue; if (u != e[i].u) swap(e[i].u, e[i].v); p[v] = u; dfs(v); timer++; } tout[u] = timer-1; } int main() { ios::sync_with_stdio(false); cin.tie(0); for (int i = maxv - 1; i < maxv * 2; i++) t[i].li = t[i].ri = i - (maxv - 1); for (int i = maxv - 2; i >= 0; i--) t[i].li = t[i * 2 + 1].li, t[i].ri = t[i * 2 + 2].ri; int n, q; ll w; cin >> n >> q >> w; for (int i = 0; i < n - 1; i++) cin >> e[i].u >> e[i].v >> e[i].x, g[--e[i].u].push_back(i), g[--e[i].v].push_back(i); dfs(0); for (int i = 0; i < n - 1; i++) update(tin[e[i].v], tout[e[i].v], e[i].x); while (q--) { int i; ll wi; cin >> i >> wi; i = ((ll)i + last) % (ll)(n-1), wi = (wi + last) % w; update(tin[e[i].v], tout[e[i].v], wi - e[i].x); e[i].x = wi; cout << t[0].ulv << "\n"; last = t[0].ulv; } 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...