Submission #1262385

#TimeUsernameProblemLanguageResultExecution timeMemory
1262385ZeroCoolDynamic Diameter (CEOI19_diameter)C++20
24 / 100
166 ms31924 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std;; #define ll long long #define ar array template<typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define int long long #define all(v) v.begin(), v.end() #define ld long double const int N = 1e5 + 20; const int M = 2; const int LOG = 20; const ll INF = 1e17; int MOD = 998244353; // #pragma GCC target("avx2") // #pragma GCC optimize("O3") // //#pragma GCC optimize("unroll-loops") template<typename T> inline void chmin(T &x,T y){x = min(x, y);} template<typename T> inline void chmax(T &x,T y){x = max(x, y);} inline void mm(int &x){x = (x % MOD + MOD) % MOD;}; struct Node{ int da; int m2da; int dam2dc; int m2dcda; int ans; Node(){ da = m2da = dam2dc = m2dcda = ans = -INF; } Node(int x){ da = x; m2da = - 2 * x; dam2dc = -x; m2dcda = -INF; ans = -INF; } }; Node operator+(Node a, Node b){ Node res; res.da = max(a.da, b.da); res.m2da = max(a.m2da, b.m2da); res.dam2dc = max({a.dam2dc, b.dam2dc, a.da + b.m2da}); res.m2dcda = max({a.m2dcda, b.m2dcda, a.m2da + b.da}); res.ans = max({a.ans, b.ans, a.dam2dc + b.da, a.da + b.m2dcda}); return res; } Node s[4 * N]; int lz[4 * N]; void bld(int k,int tl,int tr){ if(tl == tr){ s[k] = Node(0); return; } int tm = (tl + tr) / 2; bld(k * 2, tl, tm); bld(k * 2 + 1, tm + 1, tr); s[k] = s[k * 2] + s[k * 2 + 1]; } void psh(int k,int tl,int tr){ s[k].da += lz[k]; s[k].m2da -= 2 * lz[k]; s[k].dam2dc -= lz[k]; s[k].m2dcda -= lz[k]; if(tl != tr){ lz[k * 2] += lz[k]; lz[k * 2 + 1] += lz[k]; } lz[k] = 0; } void upd(int k,int tl,int tr, int l,int r,int v){ psh(k, tl, tr); if(l > tr || tl > r)return; if(l <= tl && tr <= r){ lz[k] += v; psh(k, tl, tr); return; } int tm = (tl + tr) / 2; upd(k * 2, tl, tm, l, r, v); upd(k * 2 + 1, tm + 1, tr, l, r, v); s[k] = s[k * 2] + s[k * 2 +1]; } int qry(){ psh(1, 0, 1); return s[1].ans; } vector<ar<int,2>> g[N]; int da[N]; vector<int> ord; int ind[N]; void dfs(int x,int p){ ord.push_back(x); for(auto [u, w]: g[x]){ if(u == p)continue; ind[w] = u; dfs(u, x); ord.push_back(x); } } void orz(){ int n, q, w; cin>>n>>q>>w; int A[n - 1]; for(int i = 0;i < n - 1;i++){ int a, b, c; cin>>a>>b>>c; --a, --b; A[i] = c; g[a].push_back({b, i}); g[b].push_back({a, i}); } dfs(0, 0); int L[n], R[n]; memset(L, 0x3f, sizeof L); memset(R, -0x3f, sizeof R); int m = ord.size(); for(int i = 0;i < m;i++){ chmin(L[ord[i]], i); chmax(R[ord[i]], i); } bld(1, 0, m - 1); // assert(0); for(int i = 0;i < n - 1;i++){ int x = ind[i]; upd(1, 0, m - 1, L[x], R[x], A[i]); } // cout<<qry()<<'\n'; int lst = 0; while(q--){ int a, b; cin>>a>>b; a = (a + lst) % (n - 1); b = (b + lst) % w; int x = ind[a]; upd(1, 0, m - 1, L[x], R[x], -A[a]); A[a] = b; upd(1, 0, m - 1, L[x], R[x], +A[a]); lst = qry(); cout<<lst<<'\n'; } } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; //cin>>t; while (t--)orz(); } //I am stupid :D
#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...