Cod sursa(job #3367577)

Utilizator medeeavasile56@gmail.comVasile Medeea [email protected] Data 8 octombrie 2026 18:08:15
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
// low score lca
//  O(n*queries)

#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

ifstream cin("lca.in");
ofstream cout("lca.out");

int n,queries;

vector<vector<int>> graph;
vector<int> parent,level,sol;

void read_and_initialise_tree_data()
{
    cin>>n>>queries;

    graph.resize(n+1,vector<int>());
    level.resize(n+1,-1);
    parent.resize(n+1);

    parent[1]=1;
    for(int i=1;i<n;i++){
        int value; cin>>value;
        parent[i+1]=value;
        graph[i+1].push_back(value);
        graph[value].push_back(i+1);
    }
}

void bfs(int start)
{
    queue<int> q; q.push(start); level[start]=1;
    while(!q.empty()){
        int node=q.front(); q.pop();
        for(int neighbor:graph[node]){
            if(level[neighbor]!=-1) continue;
            level[neighbor]=level[node]+1;
            q.push(neighbor);
        }
    }
}

void compare(int &node1,int &node2)
{
    while(level[node1]>level[node2]){
        node1=parent[node1];
    }
    while(level[node2]>level[node1]){
        node2=parent[node2];
    }
}

int lca(int& node1,int& node2)
{
    while(parent[node1]!=parent[node2]){
        node1=parent[node1];
        node2=parent[node2];
    }return parent[node1];
}

void read_and_answer_queries()
{
    for(int i=0;i<queries;i++){
        int node1,node2; cin>>node1>>node2;
        compare(node1,node2);
        if(node1==node2){
            sol.push_back(node1); continue;
        }
        sol.push_back(lca(node1,node2));
    }
}

void print_solution()
{
    for(int x:sol) cout<<x<<'\n';
}

int main()
{
    read_and_initialise_tree_data();
    bfs(1);
    read_and_answer_queries();
    print_solution();

    return 0;
}