Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- using namespace std;
- const int maxn = 1e6 + 10;
- vector<int> graph[maxn];
- int in_time[maxn], out_time[maxn];
- int up_node[maxn][25];
- int timer, LOG, n;
- void dfs(int node, int parent) {
- in_time[node] = ++timer;
- up_node[node][0] = parent;
- for(int i = 1; i <= LOG; i++) {
- up_node[node][i] = up_node[ up_node[node][i - 1] ][i - 1];
- }
- for(int i = 0; i < (int) graph[node].size(); i++) {
- int neighbour = graph[node][i];
- if(parent != neighbour) {
- dfs(neighbour, node);
- }
- }
- out_time[node] = ++timer;
- }
- bool is_ancestor(int A, int B) {
- return in_time[A] <= in_time[B] and out_time[A] >= out_time[B];
- }
- int LCA(int A, int B) {
- if(is_ancestor(A, B)) {
- return A;
- }
- if(is_ancestor(B, A)) {
- return B;
- }
- for(int i = LOG; i >= 0; i--) {
- if(!is_ancestor(up_node[A][i], B)) {
- A = up_node[A][i];
- }
- }
- return up_node[A][0];
- }
- void preprocess() {
- timer = 0;
- LOG = 0;
- while((1 << LOG) <= n) {
- LOG++;
- }
- dfs(0, -1);
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin >> n;
- for(int i = 1; i < n; i++) {
- int a, b;
- cin >> a >> b;
- a--; b--;
- graph[a].push_back(b);
- graph[b].push_back(a);
- }
- preprocess();
- int q;
- cin >> q;
- for(int i = 0; i < q; i++) {
- int a, b;
- cin >> a >> b;
- a--; b--;
- cout << LCA(a, b) << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement