This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Bismi Allah
#include "bits/stdc++.h"
using namespace std;
int T, K;
vector <vector <int>> g;
map <pair <int,int>,int> pos;
map <int,pair <int,int>> revPos;
vector <int> rk, depth, head, heavy, t, parent;
void push(int v, int vl, int vr) {
if(vl != vr) {
t[2*v+1] += t[v];
t[2*v+2] += t[v];
t[v] = 0;
}
}
int get(const int pos, int vl = 0, int vr = K - 1, int v = 0) {
push(v, vl, vr);
if(vl == vr) return t[v];
int vm = (vl + vr) / 2;
if(pos <= vm) return get(pos, vl, vm, 2*v+1);
else return get(pos, vm+1, vr, 2*v+2);
}
void update(const int l, const int r, int vl = 0, int vr = K - 1, int v = 0) {
push(v, vl, vr);
if(r < vl || l > vr) return;
if(l <= vl && vr <= r) {
t[v] += 1;
push(v, vl, vr);
return;
}
int vm = (vl + vr) / 2;
update(l, r, vl, vm, 2*v+1);
update(l, r, vm+1, vr, 2*v+2);
}
void distance(int a, int b) {
while(head[a] != head[b]) {
if(depth[head[a]] > depth[head[b]]) swap(a, b);
update(pos[{min(b, parent[b]), max(b, parent[b])}], pos[{min(a, heavy[a]), max(a, heavy[a])}]);
b = parent[head[b]];
}
if(a == b) {
return;
}
if(depth[a] > depth[b]) swap(a, b);
update(pos[{min(b, parent[b]), max(b, parent[b])}], pos[{min(a, heavy[a]), max(a, heavy[a])}]);
}
void compose(int v = 0, int h = 0, int p = -1) {
//cout << heavy[v] << "\n";
head[v] = h;
pos[{min(v, p), max(v, p)}] = T ++;
revPos[T-1] = {min(v, p), max(v, p)};
if(heavy[v] != -1) {
compose(heavy[v], h, v);
}
for(auto u : g[v]) {
if(p == u || u == heavy[v]) continue;
compose(u, u, v);
}
}
void dfs(int v = 0, int p = -1) {
parent[v] = p;
rk[v] = 1;
if(p == -1) depth[v] = 0;
else depth[v] = depth[p] + 1;
for(auto u : g[v]) {
if(u == p) continue;
dfs(u, v);
rk[v] += rk[u];
}
if(rk[v] == 1) return;
for(auto u : g[v]) {
if(u == p) continue;
if(rk[heavy[v]] < rk[u] || heavy[v] == -1) {
heavy[v] = u;
}
}
}
signed main () {
int n, m, k;
cin >> n >> m >> k;
T = 0;
K = 1;
while(K < n) K <<= 1;
t.resize(2*K-1);
rk.resize(n);
depth.resize(n);
head.resize(n);
g.resize(n);
heavy.resize(n, -1);
parent.resize(n);
map <pair <int,int>,int> edge;
for(int i = 0, u, v; i < n - 1; i ++) {
cin >> u >> v;
u --, v --;
edge[{u, v}] = i;
edge[{v, u}] = i;
g[u].push_back(v);
g[v].push_back(u);
}
dfs();
compose();
for(int i = 0; i < m; i ++) {
int sz;
cin >> sz;
int a, b;
cin >> a >> b;
distance(a, b);
}
vector <int> ans;
for(int i = 0; i < n; i ++) {
if(get(i) >= k)
ans.push_back(edge[revPos[i]] + 1);
}
cout << ans.size() << "\n";
for(auto i : ans) cout << i << " ";
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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |