Submission #884727

#TimeUsernameProblemLanguageResultExecution timeMemory
884727AlishDynamic Diameter (CEOI19_diameter)C++17
31 / 100
438 ms31380 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long int	ll;
typedef pair<int, int>	pii;
typedef pair<ll, ll>	pll;


#define F		        first
#define S		        second
#define pb		        push_back
#define endl            '\n'
#define Mp		        make_pair
#define all(x)          x.begin(), x.end()
#define debug(x)        cerr << #x << " = " << x << endl;
#define fast_io         ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io         freopen("connect.in" , "r" , stdin) ; freopen("connect.out" , "w" , stdout);


ll mod = 1e9+7 ;

const int N = 1e5+23;
vector<pll> g[N];
int st[N], ft[N], tim, pos[N];
vector<pair<pll, ll> > E;
ll seg[4*N], lpz[4*N];
int n, q;
ll h[N];
ll ans[N];

void dfs(int v, int p=0){
    st[v]=tim++;
    pos[st[v]]=v;
    for (auto pp: g[v]){
        ll u=pp.F, w=pp.S;
        if(u==p) continue;
        h[u]=h[v]+w;
        dfs(u, v);
    }
    ft[v]=tim;
}

void Shift(int l, int r, int ind=0){
    if(r-l==1)return ;
    if(!lpz[ind]) return;
    seg[2*ind+1]+=lpz[ind];
    seg[2*ind+2]+=lpz[ind];
    lpz[2*ind+1]+=lpz[ind];
    lpz[2*ind+2]+=lpz[ind];
    lpz[ind]=0;
}

void build(int l=0, int r=n, int ind=0){

    if(r-l==1){
        seg[ind]=h[pos[l]];
        return ;
    }
    int mid=(r+l)>>1;
    build(l, mid, 2*ind+1); build(mid, r, 2*ind+2);
    seg[ind]=max(seg[2*ind+1], seg[2*ind+2]);
}

void upd(int lx, int rx, ll v, int l=0, int r=n, int ind=0){

    Shift(l, r, ind);
    if(lx>=r || rx<=l)return;
    if(lx<=l && rx>=r){
        seg[ind]+=v;
        lpz[ind]+=v;
        return;
    }
    int mid=(r+l)>>1;
    upd(lx, rx, v, l, mid, 2*ind+1);
    upd(lx, rx, v, mid, r, 2*ind+2);
    seg[ind]=max(seg[2*ind+1], seg[2*ind+2]);

}

ll get(int lx, int rx, int l=0, int r=n, int ind=0){
    Shift(l, r, ind);
    if(lx>=r || rx<=l) return 0;
    if(lx<=l && rx>=r) return seg[ind];
    int mid=(r+l)>>1;
    return max(get(lx, rx, l, mid, 2*ind+1), get(lx, rx, mid, r, 2*ind+2));
}


int main()
{
    //fast_io
    cin>>n>>q>>mod;
    for (int i=0; i<n-1; i++){
        ll u, v, w; cin>>v>>u>>w;
        g[v].pb({u, w}); g[u].pb({v, w});
        E.pb({{v, u}, w});
    }
    dfs(1); build();
    set<pll> stt;
    vector<pll> temp;
    for (auto pp: g[1]){
        ll u=pp.F;
        stt.insert({get(st[u], ft[u]), u});
        temp.pb({st[u], u});
        ans[u]=get(st[u], ft[u]);
    }
    temp.pb({N, N});
    sort(all(temp));


    ll la=0;
    while(q--){
        ll i, w;
        cin>>i>>w;
        i=(i+la)%(n-1);
        w=(w+la)%mod;
        ll v=E[i].F.F, u=E[i].F.S;
        if(st[v]<st[u])swap(u, v);
        upd(st[v], ft[v], w-E[i].S);
        E[i].S=w;
        pll why={st[v], N};

        int t=upper_bound(all(temp), why)-temp.begin()-1;
        pii ch=temp[t];
        auto x=stt.lower_bound(Mp(ans[ch.S], ch.S));
        stt.erase(x);
        ans[ch.S]=get(st[ch.S], ft[ch.S]);
        stt.insert({ans[ch.S], ch.S});

        ll res=0;

        x=stt.end();
        x--;
        res+=x->F;
        if(x!=stt.begin()){
            x--;
            res+=x->F;
        }
        cout<<res<<endl;
        la=res;

    }

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