Submission #1104744

#TimeUsernameProblemLanguageResultExecution timeMemory
1104744SSSMDynamic Diameter (CEOI19_diameter)C++17
0 / 100
5060 ms10480 KiB
#include <bits/stdc++.h>

/*
#pragma GCC optimize ("O2")
#pragma GCC optimize ("unroll-loops")
#pragma GCC optimize ("Ofast")
#pragma GCC target ("avx2")
*/

using namespace std;

/*
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds;
template<class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
*/

#define F first
#define S second
#define pb push_back
#define FIO freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout)
#define md(a) (a%mod+mod)%mod
#define all(a) a.begin(), a.end()
#define MP make_pair
#define lc id<<1
#define rc lc|1
#define mid (l+r)/2
#define kill(a) cout << a << "\n", exit(0)
typedef pair<int,int> pii;
typedef pair<long long ,long long> pll;
typedef long long ll;
typedef long double ld;
typedef vector<vector<ll>> matrix;
mt19937_64  rng(chrono::steady_clock::now().time_since_epoch().count());

ll const maxn=1e5+10, mod=1e9+7, INF=1e18, LOG=45, sq=65;

ll poww(ll a, ll b, ll mod) {
 if (b == 0) return 1;
 return 1 * poww(1 * a * a % mod, b / 2, mod) * ((b % 2 == 1) ? a : 1) % mod;
}

ll n, q, w, W[maxn], mx, dis[maxn], dp[maxn];
vector<pll> g[maxn];

void DFS(ll v, ll p=0)
{
    vector<pll> vec;
    for(auto [u, id]:g[v])
    {
        if(u!=p)
        {
            DFS(u, v);
            vec.pb({dp[u], id});
        }
    }

    for(auto [i, id]:vec)
    {
        dp[v]=max(dp[v], i+W[id]);
    }
}

int main() 
{ 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    
    cin>>n>>q>>w;
    for(ll i=1;i<n;i++)
    {
        ll v, u, w;
        cin>>v>>u>>w;
        g[v].pb({u, i});
        g[u].pb({v, i});
        W[i]=w;
    }

    ll last=0;
    while(q--)
    {
        ll d, e;
        cin>>d>>e;
        d=(d+last)%(n-1);
        e=(e+last)%w;
        W[d+1]=e;
        fill(dp, dp+n+1, 0);
        DFS(1);
        ll mx=-INF, mx2=-INF;
        for(auto [u, id]:g[1])
        {
            if(dp[u]+W[id]>mx)
            {
                mx=dp[u]+W[id];
                mx2=mx;
            }
            else if(dp[u]+W[id]>mx2)
            {
                mx2=dp[u]+W[id];
            }
        }
        if(g[1].size()==1)
        {
            cout<<dp[1]<<"\n";
            last=dp[1];
        }
        else{
            cout<<mx+mx2<<"\n";
            last=mx+mx2;
        }
    }

    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...