Submission #1275922

#TimeUsernameProblemLanguageResultExecution timeMemory
1275922tu2108Dynamic Diameter (CEOI19_diameter)C++20
100 / 100
233 ms59636 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define faster ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define fi first #define se second #define pb push_back #define getbit(x , i) ((x >> i) & 1) typedef pair<int , int> pii; const int inf = 1e18; const int mod = 1e9 + 7; const int maxn = 1e5; int n , q , W , t = 0 , ans = 0; int d[maxn + 5] , in[maxn + 5] , node_pos[maxn * 2 + 5] , out[maxn + 5]; vector<pii> adj[maxn + 5]; struct edge{ int u , v , w; }; edge e[maxn + 5]; struct node{ int dmin; pii dmax; int premax , sufmax; int lazy; void add(const int &val){ dmin += val; dmax.fi += val; lazy += val; premax -= val ; sufmax -= val; } void gan(){ dmin = inf , dmax = {-inf , 0}; premax = -inf , sufmax = -inf; lazy = 0; } void mrg(const node&A , const node &B){ dmin = min(A.dmin , B.dmin); dmax = max(A.dmax , B.dmax); premax = max({A.premax , B.premax , B.dmax.fi - 2 * A.dmin}); sufmax = max({A.sufmax , B.sufmax , A.dmax.fi - 2 * B.dmin}); } }; node st[8 * maxn + 5]; void dfs(int u){ in[u] = ++t; node_pos[t] = u; for(auto v : adj[u]){ if(in[v.fi]) continue; d[v.fi] = d[u] + v.se; dfs(v.fi); node_pos[++t] = u; } out[u] = t; } void build(int id , int l , int r){ if(l == r){ st[id].dmax = {d[node_pos[l]] , node_pos[l]}; st[id].dmin = d[node_pos[l]]; st[id].premax = st[id].sufmax = -d[node_pos[l]]; return; } int mid = (l + r) >> 1; build(id * 2 , l , mid); build(id * 2 + 1 , mid + 1 , r); st[id].mrg(st[id * 2] , st[id * 2 + 1]); } void fix(int id){ st[id * 2].add(st[id].lazy); st[id * 2 + 1].add(st[id].lazy); st[id].lazy = 0; } void update(int id , int l , int r , int u , int v , int val){ if(v < l || r < u) return; if(u <= l && r <= v){ st[id].add(val); return; } if(st[id].lazy) fix(id); int mid = (l + r) >> 1; update(id * 2 , l , mid , u , v , val); update(id * 2 + 1 , mid + 1 , r , u , v , val); st[id].mrg(st[id * 2] , st[id * 2 + 1]); } node get(int id , int l , int r , int u , int v){ node cur; cur.gan(); if(v < l || r < u) return cur; if(u <= l && r <= v) return st[id]; if(st[id].lazy) fix(id); int mid = (l + r) >> 1; node getl = get(id * 2 , l , mid , u , v); node getr = get(id * 2 + 1 , mid + 1 , r , u , v); cur.mrg(getl , getr); return cur; } main() { faster cin >> n >> q >> W; for(int i = 1 ; i <= n - 1 ; ++i){ cin >> e[i].u >> e[i].v >> e[i].w; adj[e[i].u].pb({e[i].v , e[i].w}); adj[e[i].v].pb({e[i].u , e[i].w}); } dfs(1); build(1 , 1 , t); while(q--){ int id , val; cin >> id >> val; id = (id + ans) % (n - 1) + 1; val = (val + ans) % W; if(in[e[id].u] > in[e[id].v]) swap(e[id].u , e[id].v); update(1 , 1 , t , in[e[id].v] , out[e[id].v] , val - e[id].w); node gan = get(1 , 1 , t , 1 , t); int leafmax = gan.dmax.se; int disleaf = gan.dmax.fi; int res = max(get(1 , 1 , t , 1 , in[leafmax]).sufmax , get(1 , 1 , t , in[leafmax] + 1 , t).premax); ans = res + disleaf; cout << ans << '\n'; e[id].w = val; } }

Compilation message (stderr)

diameter.cpp:119:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  119 | main()
      | ^~~~
#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...