Cod sursa(job #1670837)

Utilizator AdrianVrAdrian Stefan Vramulet AdrianVr Data 1 aprilie 2016 03:46:14
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <bits/stdc++.h>
using namespace std;
#define NMax 100008
ifstream f("lca.in");
ofstream g("lca.out");
int R,n,m,tata[NMax],x,y,niv[NMax];
void nivel(int i)
{
    if(niv[tata[i]]==0)
        nivel(tata[i]);
    niv[i]=niv[tata[i]]+1;
}
int LCA(int x,int y)
{
    while(niv[x]!=niv[y])
        if(niv[x]>niv[y])
            x=tata[x];
        else
            y=tata[y];
    while(x!=y)
    {
        x=tata[x];
        y=tata[y];
    }
    return x;
}
int main()
{
    f>>n>>m;
    int i,j;
    R=1;
    for(i=2; i<=n; i++)
        f>>tata[i];
    niv[R]=1;
    for(i=1; i<=n; i++)
        if(niv[i]==0)
            nivel(i);
    for(i=1; i<=m; i++)
    {
        f>>x>>y;
        g<<LCA(x,y)<<'\n';
    }
    return 0;
}