import java.util.*;
import java.io.*;

public class Main {
    static List<List<Integer>> graph; 
    static int n;
    static int[] visited;
    static int[] parents;
    
    public static void bfs(int s) {
        Queue<Integer> q = new ArrayDeque<>();
        q.add(s);
        visited[s] = 1;
        parents[s] = 0;
        
        while(!q.isEmpty()) {
            int now = q.poll();
            for (int next : graph.get(now)) {
                if (visited[next] == -1) {
                    visited[next] = visited[now] + 1;
                    parents[next] = now;
                    q.add(next);
                }
            }
        }
    }

    public static int lca(int v1, int v2) {
        int l = v1; 
        int r = v2;
        int l_depth = visited[l]; 
        int r_depth = visited[r]; 
        while (visited[r] != visited[l]) {
            if (visited[l]<visited[r]) {
                r = parents[r];               
            } else {
                l = parents[l];
            }
        }

        while(true) {
            if (l==r) return l; 
            r = parents[r];
            l = parents[l];
            
        }
        
    }
    
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        n = Integer.parseInt(br.readLine());
        graph = new ArrayList<>();
        
        for (int i=0; i<n+1; i++) {
            graph.add(new ArrayList<>());
        }

        for (int i=0; i<n-1; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            graph.get(a).add(b);
            graph.get(b).add(a);
        }

        visited = new int[n+1];    
        Arrays.fill(visited, -1);
        parents = new int[n+1];
        Arrays.fill(visited, -1);
        bfs(1);


        int k = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        
        for (int i=0; i<k; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int v1 = Integer.parseInt(st.nextToken());
            int v2 = Integer.parseInt(st.nextToken());
            
            sb.append(lca(v1,v2)).append("\n");
            
        }
        System.out.println(sb);
            
        }

    

}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: