제출 #1326055

#제출 시각아이디문제언어결과실행 시간메모리
1326055nxk02102010Dynamic Diameter (CEOI19_diameter)C++20
49 / 100
4614 ms46924 KiB
#include <bits/stdc++.h> using namespace std; const int N = 200000 + 5; const long long INF = 1000000000000000005LL; struct Edge { int u, v; long long w; }; struct Node { long long du, dv, duw, dwv, duwv; Node() { du = INF; dv = -INF; duw = -INF; dwv = -INF; duwv = 0; } }; int n, q, m; long long W, res; vector<pair<int,int>> adj[N]; Edge edge[N]; int in[N], out[N], ver[N], h[N]; long long d[N]; Node st[4 * N]; long long lz[4 * N]; void euler(int u, int p) { in[u] = ++m; out[u] = m; ver[m] = u; for (auto it : adj[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; } } long long minimize(long long a, long long b) { return a < b ? a : b; } long long maximize(long long a, long long b) { return a > b ? a : b; } Node mergeNode(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 pushDown(int id) { long long v = lz[id]; if (v == 0) return; for (int t = 0; t < 2; t++) { int c = id * 2 + t; st[c].du += v; st[c].dv += v; st[c].duw -= v; st[c].dwv -= v; lz[c] += v; } lz[id] = 0; } 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]]; st[id].duwv = 0; return; } int mid = (l + r) >> 1; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); st[id] = mergeNode(st[id * 2], st[id * 2 + 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; } pushDown(id); int mid = (l + r) >> 1; update(id * 2, l, mid, u, v, x); update(id * 2 + 1, mid + 1, r, u, v, x); st[id] = mergeNode(st[id * 2], st[id * 2 + 1]); } void solve() { cin >> n >> q >> W; for (int i = 1; i < n; i++) { int u, v, w; cin >> u >> v >> w; adj[u].push_back({v, w}); adj[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; cin >> d_id >> e; d_id = (d_id + res) % (n - 1) + 1; e = (e + res) % W; int u = edge[d_id].u; int v = edge[d_id].v; int w = edge[d_id].w; if (h[u] > h[v]) swap(u, v); update(1, 1, m, in[v], out[v], e - w); res = st[1].duwv; cout << res << '\n'; edge[d_id].w = e; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); 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...