Submission #1326058

#TimeUsernameProblemLanguageResultExecution timeMemory
1326058nxk02102010Dynamic Diameter (CEOI19_diameter)C++20
49 / 100
4630 ms46912 KiB
#include <bits/stdc++.h> using namespace std; const int N = 200000 + 5; const int MAX = 1000000; const int MOD = 1000000007; const long long oo = 1000000000000000005LL; int n, q, m, TIME; long long W, res; long long lz[4 * N], d[N]; int in[N], out[N], ver[N], h[N]; vector<pair<int,int>> e[N]; struct ed { int u, v; long long w; } edge[N]; void euler(int u, int p) { in[u] = ++m; out[u] = m; ver[m] = u; for (auto it : e[u]) { int v = it.first; int w = it.second; if (v == p) continue; h[v] = h[u] + 1; d[v] = d[u] + w; euler(v, u); } if (p != 0) { out[p] = ++m; ver[m] = p; } } struct node { long long du, dv, duw, dwv, duwv; node() { du = oo; dv = -oo; duw = -oo; dwv = -oo; duwv = 0; } } st[4 * N]; void down(int id) { st[2 * id].du += lz[id]; st[2 * id].dv += lz[id]; st[2 * id].duw -= lz[id]; st[2 * id].dwv -= lz[id]; lz[2 * id] += lz[id]; st[2 * id + 1].du += lz[id]; st[2 * id + 1].dv += lz[id]; st[2 * id + 1].duw -= lz[id]; st[2 * id + 1].dwv -= lz[id]; lz[2 * id + 1] += lz[id]; lz[id] = 0; } long long minimize(const long long &A, const long long &B) { if (A < B) return A; return B; } long long maximize(const long long &A, const long long &B) { if (A > B) return A; return B; } node Merge(const node &A, const node &B) { node res; res.du = minimize(A.du, B.du); res.dv = maximize(A.dv, B.dv); res.duw = maximize(A.duw, B.duw); res.duw = maximize(res.duw, A.dv - 2 * B.du); res.dwv = maximize(A.dwv, B.dwv); res.dwv = maximize(res.dwv, B.dv - 2 * A.du); res.duwv = maximize(A.duwv, B.duwv); res.duwv = maximize(res.duwv, A.duw + B.dv); res.duwv = maximize(res.duwv, A.dv + B.dwv); return res; } void build(int id, int l, int r) { if (l == r) { st[id].du = d[ver[l]]; st[id].dv = d[ver[l]]; st[id].duw = -d[ver[l]]; st[id].dwv = -d[ver[l]]; return; } int mid = (l + r) / 2; build(2 * id, l, mid); build(2 * id + 1, mid + 1, r); st[id] = Merge(st[2 * id], st[2 * id + 1]); } void update(int id, int l, int r, int u, int v, long long x) { if (l > v || r < u) return; if (u <= l && r <= v) { st[id].du += x; st[id].dv += x; st[id].duw -= x; st[id].dwv -= x; lz[id] += x; return; } down(id); int mid = (l + r) / 2; update(2 * id, l, mid, u, v, x); update(2 * id + 1, mid + 1, r, u, v, x); st[id] = Merge(st[2 * id], st[2 * id + 1]); } void solve() { cin >> n >> q >> W; for (int i = 1; i <= n - 1; i++) { int u, v, w; cin >> u >> v >> w; e[u].push_back({v, w}); e[v].push_back({u, w}); edge[i] = {u, v, w}; } euler(1, 0); build(1, 1, m); while (q--) { int d_id; long long e_new; cin >> d_id >> e_new; d_id = (d_id + res) % (n - 1) + 1; e_new = (e_new + res) % W; int u = edge[d_id].u; int v = edge[d_id].v; long long w = edge[d_id].w; if (h[u] > h[v]) swap(u, v); update(1, 1, m, in[v], out[v], e_new - w); res = st[1].duwv; cout << res << "\n"; edge[d_id].w = e_new; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int t = 1; while (t--) { solve(); } 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...