Submission #1326151

#TimeUsernameProblemLanguageResultExecution timeMemory
1326151boclobanchatDynamic Diameter (CEOI19_diameter)C++20
100 / 100
295 ms47756 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
struct edge
{
	long long nex,pos,val;
};
struct node
{
	long long ans,mnpref,mxsuff,fpref,fsuff,fsum,sum;
};
node merge(node a,node b)
{
	node c;
	c.ans=max(max(a.ans,b.ans),max(-a.mnpref+b.fsuff,a.fpref+b.mxsuff));
	c.mnpref=min(b.mnpref,b.sum+a.mnpref);
	c.mxsuff=max(a.mxsuff,a.sum+b.mxsuff);
	c.fsum=max(-a.sum+b.sum,max(-a.sum+b.fsum,a.fsum+b.sum));
	c.fpref=max(-a.mnpref+b.fsum,max(b.fpref,b.sum+a.fpref));
	c.fsuff=max(b.mxsuff+a.fsum,max(a.fsuff,-a.sum+b.fsuff));
	c.sum=a.sum+b.sum;
	return c;
}
node seg[MAXN*4];
void update(int l,int r,int i,long long val,int pos)
{
	if(i<l||r<i) return ;
	if(l==r)
	{
		seg[pos]={abs(val),val,val,abs(val),abs(val),abs(val),val};
		return ;
	}
	int mid=(l+r)/2;
	update(l,mid,i,val,pos*2);
	update(mid+1,r,i,val,pos*2+1);
	seg[pos]=merge(seg[pos*2],seg[pos*2+1]);
}
vector<edge> ds[MAXN];
int L[MAXN],R[MAXN],pos[MAXN],tdfs=0;
long long len[MAXN];
void dfs(int i,int pre)
{
	L[i]=++tdfs;
	for(auto v:ds[i]) if(v.nex!=pre)
	{
		pos[v.pos]=v.nex;
		dfs(v.nex,i);
	}
	R[i]=++tdfs;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,q;
	long long w;
	cin>>n>>q>>w;
	for(int i=1;i<n;i++)
	{
		long long l,r,v;
		cin>>l>>r>>v;
		ds[l].push_back({r,i,v}),ds[r].push_back({l,i,v});
		len[i]=v;
	}
	dfs(1,1);
	for(int i=1;i<n;i++)
	{
		update(1,n*2,L[pos[i]],len[i],1);
		update(1,n*2,R[pos[i]],-len[i],1);
	}
	long long last=0;
	while(q--)
	{
		long long d,e;
		cin>>d>>e;
		d=(d+last)%(n-1)+1,len[d]=e=(e+last)%w;
		update(1,n*2,L[pos[d]],e,1);
		update(1,n*2,R[pos[d]],-e,1);
		cout<<(last=seg[1].ans)<<"\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...