Submission #1300312

#TimeUsernameProblemLanguageResultExecution timeMemory
1300312lmaobruhDynamic Diameter (CEOI19_diameter)C++20
100 / 100
265 ms181164 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ii pair<int, int> #define fi first #define se second #define fo(i,a,b) for (int i = (a); i <= (b); ++i) #define fd(i,a,b) for (int i = (a); i >= (b); --i) #define all(x) x.begin(), x.end() #define maxi(a,b) a=max(a,b) #define mini(a,b) a=min(a,b) #define ve vector #define pb push_back #define er(x) cerr << (#x) << " = " << x << '\n' #define _ << ' ' << #define sus siuuuuu const int N = 1e6+5, inf = 1e9+10, mod = 1e9+7; /** **/ struct node { ll Hmin, Hmax, Hpre, Hsuf, diam; node() { Hmin=Hmax=Hpre=Hsuf=diam=0; } node(ll x, ll y, ll z, ll u, ll v) { Hmin=x, Hmax=y, Hpre=z, Hsuf=u, diam=v; } } t[N<<2]; ll la[N<<2]; #define lc (p<<1) #define rc (lc|1) void write(int p, ll x) { t[p].Hmin += x; t[p].Hmax += x; t[p].Hpre -= x; t[p].Hsuf -= x; la[p] += x; } void down(int p) { if (la[p]) { write(lc, la[p]); write(rc, la[p]); la[p] = 0; } } node mer(node x, node y) { node z = node(); z.diam = max({x.diam, y.diam, x.Hpre + y.Hmax, x.Hmax + y.Hsuf}); z.Hmin = min(x.Hmin, y.Hmin); z.Hmax = max(x.Hmax, y.Hmax); z.Hpre = max({x.Hpre, y.Hpre, x.Hmax - 2LL*y.Hmin}); z.Hsuf = max({x.Hsuf, y.Hsuf, -2LL*x.Hmin + y.Hmax}); return z; } void add(int p, int l, int r, int u, int v, ll x) { if (l>v||r<u) return; if (u<=l&&r<=v) return write(p, x); int mid = (l + r) / 2; down(p); add(lc, l, mid, u, v, x); add(rc, mid+1, r, u, v, x); t[p] = mer(t[lc], t[rc]); } int n, q, tin[N], tout[N], tour[N], tim; ll tmp, sum[N]; ve<pair<int, ll>> g[N]; void dfs(int u, int p = -1) { tim++; tin[u]=tim, tour[tim]=u; for (auto &x:g[u]) if (x.fi != p) { sum[x.fi]=sum[u]+x.se; dfs(x.fi, u); tour[++tim]=u; } tout[u]=tim; } void init(int p, int l, int r) { if (l == r) { int x=tour[l]; t[p] = node{sum[x],sum[x],-sum[x],-sum[x],0}; return; } int mid = (l + r) / 2; init(lc, l, mid); init(rc, mid+1, r); t[p]=mer(t[lc],t[rc]); } ve<array<ll,3>> eds; void solve() { cin >> n >> q >> tmp; fo(i,1,n-1) { ll u, v, c; cin >> u >> v >> c; g[u].pb({v,c}); g[v].pb({u,c}); eds.pb({u,v,c}); } dfs(1); int m = 2*n-1; for (auto &v : eds) { if (tin[v[0]] < tin[v[1]]) swap(v[0],v[1]); } init(1,1,m); ll last = 0; while (q--) { ll d, e; cin >> d >> e; d = (d + last) % (n - 1); e = (e + last) % tmp; add(1,1,m,tin[eds[d][0]],tout[eds[d][0]],e-eds[d][2]); eds[d][2]=e; last = t[1].diam; cout << last << '\n'; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen("a.inp","r")) { freopen("a.inp","r",stdin); freopen("a.out","w",stdout); } solve(); }

Compilation message (stderr)

diameter.cpp: In function 'int main()':
diameter.cpp:136:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  136 |         freopen("a.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~
diameter.cpp:137:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  137 |         freopen("a.out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
#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...