제출 #409112

#제출 시각아이디문제언어결과실행 시간메모리
409112vuhoanggiapSynchronization (JOI13_synchronization)C++17
100 / 100
368 ms25444 KiB
#include <bits/stdc++.h>
#define pb push_back
using namespace std;

const int maxN = 1e5 + 5, maxM = 2e5 + 5;  
int n, m, q; 
vector<int> adj[maxN]; 

int A[maxM], B[maxM]; 
bool state[maxM]; 

int euler; 
int s[maxN], e[maxN]; 
int jump[maxN][22]; 

void dfs(int u, int p) {
	s[u] = ++euler; 
	jump[u][0] = p; 
	for(int i = 1; i < 20; i++) 
		jump[u][i] = jump[jump[u][i - 1]][i - 1]; 
	for(auto v : adj[u])
		if(v != p)
			dfs(v, u); 
	e[u] = euler; 
}

int fen[maxN]; 
void update(int i, int val) { while(i <= n + 1) fen[i] += val, i += (i & (-i)); }
int query(int i) { int ret = 0; while(i) ret += fen[i], i -= (i & (-i)); return ret; }

int ancestor(int u) {
	int oldu = u; 
	for(int i = 19; i >= 0; i--) 
		if(query(s[oldu]) == query(s[jump[u][i]]))
			u = jump[u][i]; 
	return u; 
}

int distinct[maxN], distinctUp[maxN]; 
int ans[maxN]; 

signed main() {
	ios_base::sync_with_stdio(0); 
	cin.tie(0); cout.tie(0);
	cin >> n >> m >> q; 
	for(int i = 1; i < n; i++) {
		cin >> A[i] >> B[i]; 
		adj[A[i]].pb(B[i]); 
		adj[B[i]].pb(A[i]); 
	} 
	dfs(1, 1);
	for(int i = 1; i <= n; i++) {
		distinct[i] = 1; 
		update(s[i], 1); 
		update(e[i] + 1, -1); 
	}
	for(int i = 1; i < n; i++) 
		if(jump[A[i]][0] == B[i])
			swap(A[i], B[i]); 
	for(int i = 1; i <= m; i++) {
		int id; cin >> id; 
		if(!state[id]) {
			int u = ancestor(A[id]); 
			distinct[u] += distinct[B[id]] - distinctUp[B[id]]; 
			update(s[B[id]], -1); 
			update(e[B[id]] + 1, 1); 
		}
		else {
			int u = ancestor(A[id]); 
			distinct[B[id]] = distinctUp[B[id]] = distinct[u]; 
			update(s[B[id]], 1); 
			update(e[B[id]] + 1, -1); 
		}
		state[id] ^= 1; 
	}
	for(int i = 1; i <= n; i++) {
		ans[i] = distinct[ancestor(i)]; 
 	}
 	for(int i = 1; i <= q; i++) {
 		int u; cin >> u; 
 		cout << ans[u] << '\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...