제출 #1232888

#제출 시각아이디문제언어결과실행 시간메모리
1232888AdnanboiElection (BOI18_election)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h>

using namespace std;

const int MOD = 1e9 + 7;

void solve(){
	int n, q, wlim;
	cin>>n>>q>>wlim;
	vector<array<int, 3>> edges(n - 1);
	vector<vector<pair<int, int>>> adj(n + 1);
	for(int i = 0; i < n - 1; ++i){
		int u, v, w;
		cin>>u>>v>>w;
		edges[i] = {u, v, w};
		adj[u].push_back(make_pair(v, i));
		adj[v].push_back(make_pair(u, i));
	}

	vector<int> weight(n - 1);
	for(int i = 0; i < n - 1; ++i)
		weight[i] = edges[i][2];

	vector<int> depth(n + 1), parent(n + 1), from_edge(n + 1);
	function<void(int, int)> dfs = [&](int u, int p){
		for(int i = 0; i < adj[u].size(); ++i){
			int v = adj[u][i].first;
			int idx = adj[u][i].second;
			if(v == p) continue;
			depth[v] = depth[u] + weight[idx];
			parent[v] = u;
			from_edge[v] = idx;
			dfs(v, u);
		}
	};

	dfs(1, -1);

	vector<int> max1(n + 1), max2(n + 1);

	function<int(int)> dfs_depths = [&](int u){
		int d1 = 0, d2 = 0;
		for(int i = 0; i < adj[u].size(); ++i){
			int v = adj[u][i].first;
			int idx = adj[u][i].second;
			if(v == parent[u]) continue;
			int d = dfs_depths(v) + weight[idx];
			if(d > d1){
				d2 = d1;
				d1 = d;
			}else if(d > d2){
				d2 = d;
			}
		}
		max1[u] = d1;
		max2[u] = d2;
		return d1;
	};

	dfs_depths(1);

	int result = max1[1] + max2[1];

	while(q--){
		int x, y;
		cin>>x>>y;
		x = (x + result) % (n - 1);
		y = (y + result) % wlim;
		int u = edges[x][0], v = edges[x][1];
		if(parent[v] == u) swap(u, v);

		int diff = y - weight[x];
		weight[x] = y;

		int curr = v;
		while(true){
			int d1 = 0, d2 = 0;
			for(int i = 0; i < adj[curr].size(); ++i){
				int child = adj[curr][i].first;
				int idx = adj[curr][i].second;
				if(child == parent[curr]) continue;
				int d = max1[child] + weight[idx];
				if(d > d1){
					d2 = d1;
					d1 = d;
				}else if(d > d2){
					d2 = d;
				}
			}
			if(max1[curr] == d1 && max2[curr] == d2) break;
			max1[curr] = d1;
			max2[curr] = d2;
			if(curr == 1) break;
			curr = parent[curr];
		}

		result = max1[1] + max2[1];
		cout<<result<<'\n';
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	//cin>>t;
	while(t--){
		solve();
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...