This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// 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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |