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;
const int N = 1e5+10;
const int lg = 20;
int tin[N], tout[N];
int up[N][lg];
pair<int,int> e[N];
vector<int> child[N];
int tim=0;
array<int, 2> ans[N];
int depth[N];
namespace BIT {
int fen[N];
void upd(int at, int val) {
at++;
while(at < N) {
fen[at] += val;
at += at&-at;
}
}
int query(int at) {
at++;
int ret = 0;
while(at > 0) {
ret += fen[at];
at -= at&-at;
}
return ret;
}
};
void change(int at, int val) {
BIT::upd(tin[at], val);
BIT::upd(tout[at], -val);
}
int query(int anc, int ch) {
return BIT::query(tin[ch])-BIT::query(tin[anc]);
}
void dfs(int at, int p) {
up[at][0] = p;
tin[at] = tim++;
for(int i = 1;i<lg;i++) {
up[at][i] = up[up[at][i-1]][i-1];
}
for(int i = 0;i<child[at].size();i++) {
if(child[at][i] != p) {
depth[child[at][i]] = depth[at]+1;
dfs(child[at][i], at);
}
}
tout[at] = tim;
}
int findroot(int at) {
for(int i = lg-1;i>=0;i--) {
if(up[at][i] == 0)continue;
if(query(up[at][i], at) == depth[at]-depth[up[at][i]]) {
at = up[at][i];
}
}
return at;
}
int state[N];
int main () {
cin.tie(0)->sync_with_stdio(0);
int n, m, q;
cin >> n >> m >> q;
memset(up, 0, sizeof up);
for(int i = 1;i<n;i++) {
cin >> e[i].first >> e[i].second;
child[e[i].first].push_back(e[i].second);
child[e[i].second].push_back(e[i].first);
}
dfs(1, 0);
for(int i = 1;i<n;i++) {
if(depth[e[i].first]>depth[e[i].second])swap(e[i].first, e[i].second);
}
for(int i = 1;i<=n;i++)ans[i][0]=1;
for(int i = 0;i<m;i++) {
int c;
cin >> c;
state[c]^=1;
if(state[c] == 1) {
int r = findroot(e[c].first);
int v1 = ans[e[c].second][0]+ans[r][0]-ans[e[c].second][1];
change(e[c].second, 1);
ans[r][0] = v1;
}
else {
int r = findroot(e[c].second);
ans[e[c].second][1] = ans[r][0];
ans[e[c].second][0] = ans[r][0];
change(e[c].second, -1);
}
}
while(q--) {
int c;
cin >> c;
cout << ans[findroot(c)][0] << "\n";
}
}
Compilation message (stderr)
synchronization.cpp: In function 'void dfs(int, int)':
synchronization.cpp:44:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
44 | for(int i = 0;i<child[at].size();i++) {
| ~^~~~~~~~~~~~~~~~~
# | 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... |