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

#TimeUsernameProblemLanguageResultExecution timeMemory
658636lunchbox1Dynamic Diameter (CEOI19_diameter)C++17
100 / 100
463 ms46988 KiB
/* Dynamic Diameter https://oj.uz/problem/view/CEOI19_diameter */ #include <bits/stdc++.h> using namespace std; const int N = 1e5, N_ = N * 2 - 1; struct dat { long long a, b, ab, bc, abc; void lazy(long long x) { a += x; b -= 2 * x; ab -= x; bc -= x; } dat operator+(const dat& o) const { return { max(a, o.a), max(b, o.b), max(a + o.b, max(ab, o.ab)), max(b + o.a, max(bc, o.bc)), max(max(a + o.bc, ab + o.a), max(abc, o.abc)) }; } } t[N_ * 4]; long long lz[N_ * 4]; vector<pair<int, long long>> g[N]; int d[N], in[N], out[N], tt; void dfs(int p, int i) { in[i] = tt++; for (auto [j, c] : g[i]) if (p != j) d[j] = d[i] + 1, dfs(i, j), tt++; out[i] = tt - 1; } void put(int k, long long x) { t[k].lazy(x); lz[k] += x; } void push(int k) { if (lz[k] != 0) put(k << 1 | 0, lz[k]), put(k << 1 | 1, lz[k]), lz[k] = 0; } void update(int k, int l, int r, int ql, int qr, long long x) { if (ql > r || qr < l) return; else if (ql <= l && qr >= r) put(k, x); else { int m = (l + r) / 2; push(k); update(k << 1 | 0, l, m, ql, qr, x), update(k << 1 | 1, m + 1, r, ql, qr, x); t[k] = t[k << 1 | 0] + t[k << 1 | 1]; } } int main() { ios::sync_with_stdio(0), cin.tie(0); int n, q; long long A; cin >> n >> q >> A; static tuple<int, int, long long> e[N - 1]; for (int h = 0; h < n - 1; h++) { int i, j; long long c; cin >> i >> j >> c, i--, j--; g[i].push_back({j, c}), g[j].push_back({i, c}); e[h] = {i, j, c}; } tt = 0; dfs(-1, 0); assert(tt <= N_); for (int h = 0; h < n - 1; h++) { auto &[i, j, c] = e[h]; if (d[i] < d[j]) swap(i, j); update(1, 0, tt - 1, in[i], out[i], c); } long long last = 0; while (q--) { int h; long long c; cin >> h >> c, h = (h + last) % (n - 1), c = (c + last) % A; auto &[i, j, c_] = e[h]; update(1, 0, tt - 1, in[i], out[i], c - c_), c_ = c; cout << (last = t[1].abc) << '\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...