Submission #388657

#TimeUsernameProblemLanguageResultExecution timeMemory
388657aryan12Synchronization (JOI13_synchronization)C++17
100 / 100
744 ms33656 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

struct edge {
	int from, to;
};

const int N = 1e5 + 5;
vector<int> g[N];
int BIT[2 * N];
int tin[N], tout[N];
int tim = 0;
int DP[20][N];
bool isActive[N];

void dfs(int node, int par) {
	DP[0][node] = par;
	tin[node] = ++tim;
	for(int i = 0; i < g[node].size(); i++) {
		if(g[node][i] == par) {
			continue;
		}
		dfs(g[node][i], node);
	}
	tout[node] = ++tim;
}

void Update(int idx, int val) {
	for(int i = idx; i < 2 * N; i += (i & (-i))) {
		BIT[i] += val;
	}
}

int Query(int idx) {
	int ans = 0;
	for(int i = idx; i > 0; i -= (i & (-i))) {
		ans += BIT[i];
	}
	return ans;
}

int FindAncestor(int curNode) {
	int ancestor = curNode;
	int cnt = Query(tin[curNode]);
	for(int i = 19; i >= 0; i--) {
		if(DP[i][ancestor] != -1) {
			int thisCnt = Query(tin[DP[i][ancestor]]);
			if(thisCnt == cnt) {
				ancestor = DP[i][ancestor];
			}
		}
	}
	return ancestor;
}

void Solve() {
	for(int i = 0; i < 2 * N; i++) {
		BIT[i] = 0;
	}
	for(int i = 0; i < N; i++) {
		isActive[i] = false;
	}
	int n, m, q;
	cin >> n >> m >> q;
	vector<edge> edges(n);
	for(int i = 1; i < n; i++) {
		cin >> edges[i].from >> edges[i].to;
		g[edges[i].from].push_back(edges[i].to);
		g[edges[i].to].push_back(edges[i].from);
	}
	int UniqueInfo[n + 1], InfoBeforeDisconnect[n + 1];
	for(int i = 1; i <= n; i++) {
		UniqueInfo[i] = 1;
		InfoBeforeDisconnect[i] = 0;
	}
	dfs(1, -1);
	for(int i = 1; i <= n; i++) {
		Update(tin[i], 1);
		Update(tout[i], -1);
	}
	for(int i = 1; i < 20; i++) {
		for(int j = 1; j <= n; j++) {
			if(DP[i - 1][j] == -1)
				DP[i][j] = -1;
			else
				DP[i][j] = DP[i - 1][DP[i - 1][j]];
		}
	}
	for(int i = 1; i <= m; i++) {
		int edgeIdx;
		cin >> edgeIdx;
		int v = edges[edgeIdx].from, u = edges[edgeIdx].to;
		//cout << "edgeIdx = " << edgeIdx << ", v = " << v << ", u = " << u << "\n";
		if(DP[0][v] != u) {
			swap(v, u);
		}
		//u is the parent
		//cout << "v = " << v << ", u = " << u << ", ancestor = " << FindAncestor(u) << "\n";
		if(!isActive[edgeIdx]) {
			//making it active now
			int ancestor = FindAncestor(u);
			UniqueInfo[ancestor] += (UniqueInfo[v] - InfoBeforeDisconnect[v]);
			UniqueInfo[v] = UniqueInfo[ancestor];
			Update(tin[v], -1);
			Update(tout[v], 1);
		}
		else {
			//making it inactive now
			int ancestor = FindAncestor(v);
			UniqueInfo[v] = UniqueInfo[ancestor];
			InfoBeforeDisconnect[v] = UniqueInfo[v];
			Update(tin[v], 1);
			Update(tout[v], -1);
		}
		isActive[edgeIdx] = !isActive[edgeIdx];
	}
	while(q--) {
		int node;
		cin >> node;
		int ancestor = FindAncestor(node);
		cout << UniqueInfo[ancestor] << "\n";
	}
}

int32_t main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	Solve();
	return 0;
}

Compilation message (stderr)

synchronization.cpp: In function 'void dfs(long long int, long long int)':
synchronization.cpp:20:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |  for(int i = 0; i < g[node].size(); i++) {
      |                 ~~^~~~~~~~~~~~~~~~
#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...