Cod sursa(job #2479753)

Utilizator tavi255Varzaru Octavian Stefan tavi255 Data 24 octombrie 2019 14:37:16
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

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

const int Max=100005;
int tata[Max];
vector <int>v[Max]; int n,m; int nivel[Max];
queue <int>q;
void citire()
{
   in>>n>>m; tata[1]=1;
   for(int i=2;i<=n;i++)
   {
       int x; in>>x; tata[i]=x;
       v[x].push_back(i);
   }
}
/*void dfs(int nod,int tata=0)
{
    nivel[nod]=nivel[tata]+1;
    for(int j=0;j<v[nod].size();j++)
    {
        int vecin=v[nod][j];
        dfs(vecin,nod);
    }
} */
void bfs(int x)
{
    q.push(x);
    while(!q.empty())
    {
        int nod=q.front(); q.pop();
         for(int j=0;j<v[nod].size();j++)
        {
            int vecin=v[nod][j];
             nivel[vecin]=nivel[nod]+1;
             q.push(vecin);
         }
    }

}
int main()
{
    citire(); bfs(1);
    for(int i=1;i<=m;i++)
    {
        int x,y; in>>x>>y;
        while(x!=y)
        {
            if(nivel[x]>nivel[y])
                x=tata[x];
            else
                y=tata[y];
        }
        out<<x<<"\n";
    }

    return 0;
}