Submission #264453

#TimeUsernameProblemLanguageResultExecution timeMemory
264453rulerSynchronization (JOI13_synchronization)C++14
100 / 100
617 ms23844 KiB
// IOI 2021
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define ends ' '
#define die(x) return cout << x << endl, 0
#define all(v) v.begin(), v.end()
#define sz(x) (int)(x.size())
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << ends << H; debug_out(T...); }
#define debug(...) cerr << "{" << #__VA_ARGS__ << "}:", debug_out(__VA_ARGS__)
typedef long long ll;
typedef pair<int, int> pii;
const ll INF = 1e9;
const ll MOD = 1e9 + 7;
 
////////////////////////////////////////////////////////////////////

const int N = 1e5 + 2, LG = 18;

int E[N << 1][2], M[N << 1], FEN[N], P[LG][N], ST[N], FT[N], DW[N], UP[N], t;
vector<int> G[N];

void Add(int p, int x) { for (p++; p < N; p += p & -p) FEN[p] += x; }
void Add(int l, int r, int x) { Add(l, x), Add(r, - x); }
int Get(int p) {
	int res = 0;
	for (; p; p -= p & -p) res += FEN[p];
	return res;
}
int Cnt(int v) { return Get(ST[v] + 1); }
void DFS(int v, int p = 0) {
	ST[v] = t++, P[0][v] = p, DW[v] = 1;
	for (int i = 1; i < LG; i++) P[i][v] = P[i - 1][P[i - 1][v]];
	for (int u : G[v]) if (u != p) DFS(u, v);
	FT[v] = t;
}
int GetRoot(int v) {
	int cnt = Cnt(v);
	for (int i = LG - 1; i >= 0; i--)
		if (P[i][v] != 0 && cnt == Cnt(P[i][v])) v = P[i][v];
	return v;
}

int main() {

	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	mt19937 Rnd(time(0));

	int n, m, q; cin >> n >> m >> q;
	for (int i = 1; i < n; i++) {
		int v, u; cin >> v >> u;
		G[v].push_back(u), G[u].push_back(v);
		E[i][0] = v, E[i][1] = u;
	}
	DFS(1);
	for (int i = 2; i <= n; i++) Add(ST[i], FT[i], +1);
	for (int i = 1; i < n; i++) if (P[0][E[i][1]] == E[i][0]) swap(E[i][0], E[i][1]);
	while (m--) {
		int i; cin >> i;
		int v = E[i][0], u = E[i][1];
		if (M[i]) {
			Add(ST[v], FT[v], + 1);
			DW[v] = UP[v] = DW[GetRoot(u)];
		} else {
			Add(ST[v], FT[v], -1);
			DW[GetRoot(u)] += DW[v] - UP[v];
		}
		M[i] ^= 1;
	}
	while (q--) {
		int v; cin >> v;
		cout << DW[GetRoot(v)] << 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...