Submission #1317492

#TimeUsernameProblemLanguageResultExecution timeMemory
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...