Submission #1245449

#TimeUsernameProblemLanguageResultExecution timeMemory
1245449abdelhakimDynamic Diameter (CEOI19_diameter)C++20
7 / 100
602 ms29840 KiB
#include <bits/stdc++.h>
#define ll long long
#define inf (ll)(1e15) 
#define mod (ll)1e9+7
#define dbg(x) cerr <<#x << ' ' << x <<endl;
using namespace std;

void printvec(vector<ll>& v)
{
  for (auto &&i : v)
  {
    cout <<i<<' ';
  }
  cout << endl;
}

vector<pair<ll,ll>> dp;
map<pair<ll,ll>,ll> wt;
vector<vector<ll>> adj;
vector<ll> parr;
vector<ll> diameter;
void dfs(ll node, ll par)
{
  parr[node]=par;
  ll mx1=0;
  ll mx2=0;
  ll mxd=0;
  for (auto &&e : adj[node])
  {
    if(e==par)continue;
    dfs(e,node);
    ll v=wt[{node,e}]+dp[e].second;
    mxd=max(mxd,diameter[e]);
    if(v > mx2)
    {
      mx2=v;
      if(mx2>mx1) swap(mx1,mx2);
    }
  }
  dp[node]={mx1+mx2,mx1};
  diameter[node]=max(mxd,dp[node].first);
}
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  ll n,q,w;
  cin>>n>>q>>w;
  vector<pair<ll,ll>> edges(n-1);
  adj.resize(n);
  dp.resize(n);
  parr.resize(n);
  diameter.resize(n);
  multiset<ll> st;
  for (int i=0;i<n-1;i++)
  {
    ll c;
    cin>>edges[i].first>>edges[i].second>>c;
    edges[i].first--;
    edges[i].second--;
    adj[edges[i].first].push_back(edges[i].second);
    adj[edges[i].second].push_back(edges[i].first);
    ll u=edges[i].first;
    ll v=edges[i].second;
    wt[{u,v}]=c;
    wt[{v,u}]=c;
    st.insert(c);
  }
  ll last=0;
  while(q--)
  {
    ll d,e;
    cin>>d>>e;
    d=(d+last)%(n-1);
    e=(e+last)%w;
    auto it=st.find(wt[edges[d]]);
    st.erase(it);
    wt[edges[d]]=e;
    wt[{edges[d].second,edges[d].first}]=e;
    st.insert(e);
    // dfs(0,0);
    // cout << diameter[0] << endl;
    ll ans=*st.rbegin();
    if(st.size() > 1) ans+=*(++st.rbegin());
    last=ans;
    cout << ans << endl;
  }
}
#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...