Submission #377501

#TimeUsernameProblemLanguageResultExecution timeMemory
377501dolphingarlicDynamic Diameter (CEOI19_diameter)C++14
49 / 100
5063 ms35176 KiB
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

ll edge[100001], dp[100001], to_par[100001];
vector<pair<int, int>> graph[100001];
int par[100001], upper[100001], lower[100001];
multiset<ll> ms[100001], all;

void dfs(int node = 1, int parent = 0) {
    par[node] = parent;
    ms[node].insert(0);
    for (pair<int, int> i : graph[node]) if (i.first != parent) {
        upper[i.second] = node, lower[i.second] = i.first;
        to_par[i.first] = i.second;
        dfs(i.first, node);
        ms[node].insert(dp[i.first] + edge[i.second]);
    }
    dp[node] = *ms[node].rbegin();
    all.insert(dp[node] + *next(ms[node].rbegin()));
}

void propagate(int node, ll prv, ll curr) {
    if (prv == curr) return;

    ll par_prv = dp[node] + edge[to_par[node]];

    all.erase(all.find(dp[node] + *next(ms[node].rbegin())));
    ms[node].erase(ms[node].find(prv));
    ms[node].insert(curr);
    dp[node] = *ms[node].rbegin();
    all.insert(dp[node] + *next(ms[node].rbegin()));

    ll par_curr = dp[node] + edge[to_par[node]];

    if (par[node]) propagate(par[node], par_prv, par_curr);
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n, q;
    ll w;
    cin >> n >> q >> w;
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        cin >> u >> v >> edge[i];
        graph[u].push_back({v, i});
        graph[v].push_back({u, i});
    }
    dfs();

    ll last = 0;
    while (q--) {
        int d;
        ll e;
        cin >> d >> e;
        d = (d + last) % (n - 1);
        e = (e + last) % w;

        propagate(upper[d], dp[lower[d]] + edge[d], dp[lower[d]] + e);
        edge[d] = e;

        last = *all.rbegin();
        cout << last << '\n';
    }
}
#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...