Cod sursa(job #1368859)

Utilizator sorynsooSorin Soo sorynsoo Data 2 martie 2015 20:23:03
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
#define maxim 100005

vector<int> graf[maxim];
int d[maxim],tata[maxim];
int n,m,i,j,x,a,b;

void dfs(int nod, int nivel)
{
    d[nod]=nivel;

    for(int i=0; i<graf[nod].size(); i++)
    {
        if(!tata[graf[nod][i]])
        {
            tata[graf[nod][i]]=nod;
            dfs(graf[nod][i],nivel+1);
        }
    }
}

int lca(int a, int b)
{
    while(a!=b)
    {
        if(d[a]>d[b])
            a=tata[a];
        else
            b=tata[b];
    }
    return a;
}
int main()
{
    cin>>n>>m;
    for(i=2; i<=n; i++)
    {
        cin>>x;
        graf[x].push_back(i);
    }
    dfs(1,1);
    for(i=1; i<=m; i++)
    {
        cin>>a>>b;
        cout<<lca(a,b)<<"\n";
    }
}