This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
vector<int> edge[100001];
int dfn[100001], efn[100001], ifn[100001], dfnn;
void dfs(int x, int p) {
dfn[x] = ++dfnn;
ifn[dfnn] = x;
for (auto i: edge[x]) {
if (i != p) dfs(i, x);
}
efn[x] = dfnn;
}
const int SIZE = 1 << 17;
struct ST {
int V[SIZE << 1];
void init(int nn, int s, int e) {
if (s == e) {
V[nn] = efn[ifn[s]];
return;
}
int m = s + e >> 1;
init(nn << 1, s, m);
init(nn << 1 | 1, m + 1, e);
V[nn] = max(V[nn << 1], V[nn << 1 | 1]);
}
void update(int nn, int ns, int ne, int x, int v) {
if (ns > x || ne < x) return;
if (ns == ne) {
V[nn] = v;
return;
}
int m = ns + ne >> 1;
update(nn << 1, ns, m, x, v);
update(nn << 1 | 1, m + 1, ne, x, v);
V[nn] = max(V[nn << 1], V[nn << 1 | 1]);
}
int query(int nn, int ns, int ne, int s, int e) {
if (ns > s || V[nn] < e) return 0;
if (ns == ne) return ifn[ns];
int m = ns + ne >> 1;
int ret = query(nn << 1 | 1, m + 1, ne, s, e);
if (ret) return ret;
return query(nn << 1, ns, m, s, e);
}
} seg;
int X[100002], Y[100002], T[100002], A[100002], B[100002];
int main(){
ios_base::sync_with_stdio(0), cin.tie(0);
int N, M, Q; cin >> N >> M >> Q;
for (int i = 1; i < N; ++i) {
cin >> X[i] >> Y[i];
edge[X[i]].push_back(Y[i]);
edge[Y[i]].push_back(X[i]);
}
dfs(1, 0);
seg.init(1, 1, N);
fill(A, A + N + 1, 1);
for (int i = 0; i < M; ++i) {
int j; cin >> j;
auto &x = X[j], &y = Y[j];
if (dfn[x] < dfn[y]) swap(x, y);
if (T[j]) {
A[x] = B[x] = A[seg.query(1, 1, N, dfn[x], efn[x])];
seg.update(1, 1, N, dfn[x], efn[x]);
}
else {
seg.update(1, 1, N, dfn[x], 0);
A[seg.query(1, 1, N, dfn[x], efn[x])] += A[x] - B[x];
}
T[j] ^= 1;
}
for (int i = 0; i < Q; ++i) {
int x; cin >> x;
cout << A[seg.query(1, 1, N, dfn[x], efn[x])] << '\n';
}
return 0;
}
Compilation message (stderr)
synchronization.cpp: In member function 'void ST::init(int, int, int)':
synchronization.cpp:25:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = s + e >> 1;
~~^~~
synchronization.cpp: In member function 'void ST::update(int, int, int, int, int)':
synchronization.cpp:37:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = ns + ne >> 1;
~~~^~~~
synchronization.cpp: In member function 'int ST::query(int, int, int, int, int)':
synchronization.cpp:46:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = ns + ne >> 1;
~~~^~~~
# | 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... |