Cod sursa(job #2495311)

Utilizator tavi255Varzaru Octavian Stefan tavi255 Data 19 noiembrie 2019 09:23:05
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
//#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int Max=100005;
int n,m,tata[Max],gr[Max],nivel[Max];
int *v[Max];
struct muchie
{
    int x,y;
}muc[Max];
void citire()
{
   in>>n>>m;
   for(int i=2;i<=n;i++)
   {
       int x; in>>x;
       tata[i]=x;
       gr[x]++;
       muc[i-1]={x,i};
   }
   for(int i=1;i<=n;i++)
   {
       v[i]= (int *) malloc(sizeof(int)*gr[i]+2);
       v[i][gr[i]]=-1;
       gr[i]=0;

   }
   for(int i=1;i<=n-1;i++)
   {
       int x=muc[i].x; int y=muc[i].y;
       v[x][gr[x]]=y;
       gr[x]++;
   }

}
void dfs(int nod,int tata=0)
{
    nivel[nod]=nivel[tata]+1;
    for(int *j=v[nod];*j!=-1;j++)
    {
       dfs(*j,nod);
    }
}
int main()
{
    citire();
    dfs(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;
}