제출 #1317492

#제출 시각아이디문제언어결과실행 시간메모리
1317492loomDynamic Diameter (CEOI19_diameter)C++20
31 / 100
266 ms25380 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define inf (int)2e18 #define _ <<' '<< #define nl '\n' const int N = 1e5+1; vector<pair<int,int>> g[N]; int pr[N], pw[N], in[N], out[N], rt[N], mx[4*N], lz[4*N]; int cnt; void lazy(int l, int r, int p){ mx[p] += lz[p]; if(l != r){ lz[p*2] += lz[p]; lz[p*2+1] += lz[p]; } lz[p] = 0; } void upd(int l, int r, int p, int ql, int qr, int v){ lazy(l, r, p); if(r < ql or qr < l) return; if(ql <= l and r <= qr){ lz[p] += v; lazy(l, r, p); return; } int m = (l+r)/2; upd(l, m, p*2, ql, qr, v); upd(m+1, r, p*2+1, ql, qr, v); mx[p] = max(mx[p*2], mx[p*2+1]); } int qry(int l, int r, int p, int ql, int qr){ lazy(l, r, p); if(r < ql or qr < l) return -inf; if(ql <= l and r <= qr) return mx[p]; int m = (l+r)/2; return max(qry(l, m, p*2, ql, qr), qry(m+1, r, p*2+1, ql, qr)); } int qry(int ql, int qr){ return qry(1, N, 1, ql, qr); } void upd(int ql, int qr, int v){ upd(1, N, 1, ql, qr, v); } void dfs(int v, int p, int d){ if(p == 1) rt[v] = v; else rt[v] = rt[p]; in[v] = cnt++; upd(in[v], in[v], d); for(auto [ch, w] : g[v]){ if(ch == p) continue; pr[ch] = v; pw[ch] = w; dfs(ch, v, d + w); } out[v] = cnt-1; } void solve(){ int n, q, m; cin>>n>>q>>m; pair<int,int> inp[n-1]; for(int i = 0; i < n-1; i++){ int a, b, c; cin>>a>>b>>c; inp[i] = {a, b}; g[a].push_back({b, c}); g[b].push_back({a, c}); } dfs(1, 0, 0); multiset<int> st; for(auto [ch, w] : g[1]){ st.insert(qry(in[ch], out[ch])); } int ans = 0; while(q--){ int i, x; cin>>i>>x; i = (i + ans) % (n-1); x = (x + ans) % m; auto [a, b] = inp[i]; if(pr[a] == b) swap(a, b); int r = rt[b]; st.erase(st.find(qry(in[r], out[r]))); upd(in[b], out[b], x - pw[b]); pw[b] = x; st.insert(qry(in[r], out[r])); ans = *st.rbegin() + (st.size() > 1 ? *prev(prev(st.end())) : 0); cout<<ans<<nl; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(NULL);cout.tie(NULL); int t = 1; //cin>>t; 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...