제출 #1303055

#제출 시각아이디문제언어결과실행 시간메모리
1303055MuhammadSaramDynamic Diameter (CEOI19_diameter)C++20
0 / 100
174 ms17388 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define endl '\n'

const int M = 1e5 + 1;

int seg[M*2], lz[M*2], st[M], en[M], dep[M], t;
vector<pair<int,int>> nei[M];

void push(int v,int lc,int rc)
{
	seg[lc]+=lz[v], lz[lc]+=lz[v];
	seg[rc]+=lz[v], lz[rc]+=lz[v];
	lz[v]=0;
}

void modify(int l,int r,int x,int v=0,int s=0,int e=M)
{
	if (l>=e or r<=s) return;
	if (l<=s && e<=r)
	{
		seg[v]+=x, lz[v]+=x;
		return;
	}
	int mid=(s+e)/2, lc=v+1, rc=v+(mid-s)*2;
	push(v,lc,rc);
	modify(l,r,x,lc,s,mid);
	modify(l,r,x,rc,mid,e);
	seg[v]=max(seg[lc],seg[rc]);
}

int get(int l,int r,int v=0,int s=0,int e=M)
{
	if (l>=e or r<=s) return 0;
	if (l<=s && e<=r) return seg[v];
	int mid=(s+e)/2, lc=v+1, rc=v+(mid-s)*2;
	push(v,lc,rc);
	return max(get(l,r,lc,s,mid),get(l,r,rc,mid,e));
}

set<pair<int,int>> se;
multiset<int,greater<int>> wei;

void dfs(int u,int p=0)
{
	st[u]=t++;
	modify(st[u],st[u]+1,dep[u]);
	for (auto [i,w]:nei[u])
		if (i!=p)
			dep[i]=dep[u]+w, dfs(i,u);
	en[u]=t;
	if (p==1) se.insert({t,u});
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL), cout.tie(NULL);
	
	int n,q,W;
	cin>>n>>q>>W;
	int u[n], v[n], w[n];
	for (int i=0;i<n-1;i++)
	{
		cin>>u[i]>>v[i]>>w[i];
		nei[u[i]].push_back({v[i],w[i]});
		nei[v[i]].push_back({u[i],w[i]});
	}
	dfs(1);
	for (int i=0;i<n-1;i++)
		if (st[v[i]]>st[u[i]]) swap(u[i],v[i]);
	for (auto [i,w]:nei[1])
		wei.insert(get(st[i],en[i])+w);
	int ls=0;
	while (q--)
	{
		int d,e;
		cin>>d>>e;
		d=(d+ls)%(n-1), e=(e+ls)%W;
		auto it=se.upper_bound({st[u[d]],0});
		wei.erase(wei.find(get(st[it->second],en[it->second])+dep[it->second]));
		modify(st[u[d]],en[u[d]],e-w[d]);
		wei.insert(get(st[it->second],en[it->second])+dep[it->second]);
		if (wei.size()==1) ls=*wei.begin();
		else
		{
			auto it=wei.begin();
			ls=*it;it++;ls+=*it;
		}
		w[d]=e;
		cout<<ls<<endl;
	}
	
	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...