Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int t, n, l, q;
- vector<vector<int>> adj, up;
- vector<int> tin, tout, h;
- void dfs(int v, int p = 1, int hh = 0) {
- tin[v] = ++t;
- up[v][0] = p;
- for(int i = 1; i <= l; i++) {
- up[v][i] = up[up[v][i - 1]][i - 1];
- }
- for(auto u : adj[v]) {
- if(u != p) {
- dfs(u, v, hh + 1);
- }
- }
- h[v] = hh;
- tout[v] = ++t;
- }
- bool isanc(int u, int v) {
- return tin[u] <= tin[v] and tout[u] >= tout[v];
- }
- int lca(int u, int v) {
- if(isanc(u, v)) {
- return u;
- }
- if(isanc(v, u)) {
- return v;
- }
- for(int i = l; i >= 0; i--) {
- if(!isanc(up[u][i], v)) {
- u = up[u][i];
- }
- }
- return up[u][0];
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- int tt;
- cin >> tt;
- for(int ii = 1; ii <= tt; ii++) {
- cout << "Case " << ii << ":\n";
- t = 0;
- int n;
- cin >> n;
- tin.clear(); tin.resize(n + 1);
- tout.clear(); tout.resize(n + 1);
- h.clear(); h.resize(n + 1);
- adj.clear(); adj.resize(n + 1);
- l = ceil(log2(n + 1)) + 1;
- up.clear(); up.assign(n + 1, vector<int>(l + 1));
- for(int i = 1; i <= n; i++) {
- int x;
- cin >> x;
- while(x--) {
- int u;
- cin >> u;
- adj[i].push_back(u);
- adj[u].push_back(i);
- }
- }
- dfs(1);
- cin >> q;
- while(q--) {
- int u, v;
- cin >> u >> v;
- cout << lca(u, v) << "\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement