Submission #1304989

#TimeUsernameProblemLanguageResultExecution timeMemory
1304989vtnooDynamic Diameter (CEOI19_diameter)C++20
0 / 100
248 ms24456 KiB
#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define snd second
#define fore(i,a,b) for(int i=a,pao=b;i<pao;++i)
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset((a),(v),sizeof(a))
#define FIN ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
#define int long long
const int MAXN=1e5+9;
const ll INF=1e18;
int tim=0,n,in[MAXN],out[MAXN],z[MAXN],up[MAXN],ew[MAXN];
vector<tuple<int,int,int>>adj[MAXN];
struct Nodo{
	ll f,s,lz;
	Nodo(){
		f=0,s=-INF;
		lz=0;
	}
	Nodo(ll a,ll b){
		f=a,s=b;
		lz=0;
	}
};
Nodo st[MAXN*4];
void apply(int v,ll x){
	st[v].lz+=x;
	st[v].f+=x;
	if(st[v].s!=-INF)st[v].s+=x;
}
void push(int v){
	apply(v*2,st[v].lz);
	apply(v*2+1,st[v].lz);
	st[v].lz=0;
}	
void upd(int ts,int te,int x,int v=1,int s=0,int e=n-1){
	if(e<ts||te<s)return;
	if(ts<=s&&e<=te){
		apply(v,x);
		return;
	}else{
		push(v);
		int m=(s+e)/2;
		upd(ts,te,x,v*2,s,m);
		upd(ts,te,x,v*2+1,m+1,e);
		vector<ll>a={st[v*2].f,st[v*2+1].f};
		sort(ALL(a));
		reverse(ALL(a));
		st[v]=Nodo(a[0],a[1]);
	}
}
void dfs(int u,int p){
	in[u]=tim++;
	for(auto&[v,c,i]:adj[u]){
		if(v==p)continue;
		up[i]=v; //el extremo superior
		z[v]=c; //valor del nodo 
		dfs(v,u);
	}
	out[u]=tim;
}	
signed main(){FIN;
    int q;
    ll w;
    cin>>n>>q>>w;
    fore(i,0,n-1){
        int u,v;
        ll c;
        cin>>u>>v>>c;
        adj[u].pb({v,c,i});
        adj[v].pb({u,c,i});
        ew[i]=c;
    }
    dfs(1,1);
    fore(i,1,n+1){
		upd(in[i],out[i]-1,z[i]);
	}
	//~ cout<<st[1].f<<" "<<st[1].s<<endl;
    ll last=0;
    while(q--){
        ll d_, e_;
        cin>>d_>>e_;
        ll d=(d_+last)%(n-1);
        ll e=(e_+last)%w;
        ll diff=e-ew[d];
		upd(in[up[d]],out[up[d]]-1,diff);
		ew[d]=e;
		ll ans=max(0ll,st[1].f)+max(0ll,st[1].s);
		cout<<ans<<endl;
		last=ans;
    }
}
#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...