Cod sursa(job #2120985)

Utilizator vladavladaa vlada Data 3 februarie 2018 10:40:03
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

vector<int> g[100001];
int deep[100001],dad[100001],n,m,p,q;
void dfs(int nod)
{
    for(int y=0;y<g[nod].size();y++)
    {
        deep[g[nod][y]]=deep[nod]+1;
        dfs(g[nod][y]);
    }
}
int lca(int x,int y)
{
    while(deep[x]>deep[y])
        x=dad[x];
    while(deep[y]>deep[x])
        y=dad[y];
    while(x!=y)
    {
        x=dad[x];
        y=dad[y];
    }
    return x;
}
int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        fin>>dad[i];
        g[dad[i]].push_back(i);
    }
    deep[1]=1;
    dfs(1);
    for(int i=1;i<=m;i++)
    {
        fin>>p>>q;
        fout<<lca(p,q)<<'\n';
    }
    return 0;
}