//This is a fucking meme. I hope the intended solution is not this
#pragma GCC optimize("O2")
#pragma GCC target("avx,avx2,sse,sse2,ssse3,sse4.1,sse4.2,popcnt,tune=native")
#include<bits/stdc++.h>
#define all(x) x.begin(), x.end()
#define pb push_back
using namespace std;
using ll = long long;
const int maxn = 1<<17;
int n, m, q, sz[maxn], tin[maxn], h[maxn], head[maxn], idx[maxn], p[maxn], ans[maxn], timer = 0;
vector<int> g[maxn], ord;
vector<array<int, 2>> edges;
vector<array<int, 3>> ops;
int tree[maxn*2];
void toggle(int p) {
for(tree[p+=n] ^= 1; p>>=1;) tree[p] = min(tree[p<<1], tree[p<<1|1]);
}
int get(int l, int r) {
int a = 1;
for(l += n, r += n + 1; l < r; l>>=1, r>>=1) {
if(l&1) a = min(a, tree[l++]);
if(r&1) a = min(tree[--r], a);
}
return a;
}
void dfs(int v) {
sz[v] = 1;
for(auto &i : g[v]) {
g[i].erase(find(all(g[i]), v));
p[i] = v;
h[i] = h[v] + 1;
dfs(i);
sz[v] += sz[i];
if(sz[i] > sz[g[v][0]]) swap(i, g[v][0]);
}
ord.pb(v);
}
void hld(int v) {
idx[timer] = v;
tin[v] = timer++;
for(auto &i : g[v]) {
head[i] = g[v][0] == i ? head[v] : i;
hld(i);
}
}
int getpar(int v) {
while(get(tin[head[v]], tin[v]) == 1) v = p[head[v]];
int i = tin[v], l = tin[head[v]];
for(int z = 1<<17; z>>=1;)
if(i-z >= l && get(i-z, i) == 1) {
i-=z;
}
i -= get(i, i);
return idx[i];
}
int finalpar[maxn];
void find(int v) {
if(get(tin[v], tin[v])) finalpar[v] = finalpar[p[v]];
else finalpar[v] = v;
for(auto &i : g[v])
find(i);
}
ll val[maxn];
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m >> q;
edges.resize(n-1);
for(auto &i : edges) cin >> i[0] >> i[1];
for(auto [f, t] : edges) {
g[f].pb(t);
g[t].pb(f);
}
dfs(1);
head[1] = 1;
hld(1);
for(auto &i : edges) if(h[i[0]] < h[i[1]]) swap(i[0], i[1]);
for(int i; m--;) {
cin >> i;
auto [l, h] = edges[i-1];
int P = getpar(h);
ops.pb({get(tin[l], tin[l]), l, P});
toggle(tin[l]);
}
find(1);
for(int b = 0; b*64 < n; b++) {
memset(val, 0, sizeof val);
for(int k = 0; k < 64 && 64*b + k < n; k++) val[64*b + k + 1] = 1ll<<k;
//for(int i = 1; i <= n; i++) cout << val[i] << " "; cout << '\n';
for(auto [tp, v, rt] : ops) {
if(tp) val[v] = val[rt];
else val[rt] |= val[v];
}
for(int i = 1; i <= n; i++) ans[i] += __builtin_popcountll(val[finalpar[i]]);
}
for(int i; q--;) cin >> i, cout << ans[i] << '\n';
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
7 ms |
4480 KB |
Output is correct |
2 |
Correct |
8 ms |
4480 KB |
Output is correct |
3 |
Correct |
7 ms |
4480 KB |
Output is correct |
4 |
Correct |
7 ms |
4480 KB |
Output is correct |
5 |
Correct |
7 ms |
4480 KB |
Output is correct |
6 |
Correct |
8 ms |
4608 KB |
Output is correct |
7 |
Correct |
39 ms |
5932 KB |
Output is correct |
8 |
Correct |
39 ms |
5932 KB |
Output is correct |
9 |
Correct |
39 ms |
5932 KB |
Output is correct |
10 |
Correct |
2474 ms |
17888 KB |
Output is correct |
11 |
Correct |
2359 ms |
18020 KB |
Output is correct |
12 |
Correct |
2414 ms |
22500 KB |
Output is correct |
13 |
Correct |
2186 ms |
17892 KB |
Output is correct |
14 |
Correct |
934 ms |
16104 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1408 ms |
20068 KB |
Output is correct |
2 |
Correct |
1419 ms |
19812 KB |
Output is correct |
3 |
Correct |
871 ms |
20644 KB |
Output is correct |
4 |
Correct |
876 ms |
20636 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
7 ms |
4480 KB |
Output is correct |
2 |
Correct |
7 ms |
4480 KB |
Output is correct |
3 |
Correct |
8 ms |
4480 KB |
Output is correct |
4 |
Correct |
8 ms |
4480 KB |
Output is correct |
5 |
Correct |
7 ms |
4480 KB |
Output is correct |
6 |
Correct |
9 ms |
4736 KB |
Output is correct |
7 |
Correct |
49 ms |
6568 KB |
Output is correct |
8 |
Correct |
2450 ms |
23264 KB |
Output is correct |
9 |
Correct |
2445 ms |
23268 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2461 ms |
23268 KB |
Output is correct |
2 |
Correct |
906 ms |
21736 KB |
Output is correct |
3 |
Correct |
901 ms |
21864 KB |
Output is correct |
4 |
Correct |
891 ms |
21964 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
8 ms |
4480 KB |
Output is correct |
2 |
Correct |
8 ms |
4480 KB |
Output is correct |
3 |
Correct |
8 ms |
4480 KB |
Output is correct |
4 |
Correct |
7 ms |
4480 KB |
Output is correct |
5 |
Correct |
8 ms |
4608 KB |
Output is correct |
6 |
Correct |
48 ms |
6060 KB |
Output is correct |
7 |
Correct |
2402 ms |
18916 KB |
Output is correct |
8 |
Correct |
2454 ms |
23384 KB |
Output is correct |
9 |
Correct |
2255 ms |
19084 KB |
Output is correct |
10 |
Correct |
950 ms |
17428 KB |
Output is correct |
11 |
Correct |
1418 ms |
21368 KB |
Output is correct |
12 |
Correct |
1427 ms |
21348 KB |
Output is correct |
13 |
Correct |
891 ms |
21868 KB |
Output is correct |