Cod sursa(job #1688323)

Utilizator firutibogdanFiruti Bogdan-Cristian firutibogdan Data 13 aprilie 2016 13:29:44
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
using namespace std;
int i,n,m,tata[100002],u,v,poz1,poz2,lv1,lv2;
int nivel(int x)
{
    int lv=0;
    while(tata[x]!=0)
    {
        x=tata[x];
        lv++;
    }
    return lv;
}
int main()
{
     ifstream fin("lca.in");
    ofstream fout("lca.out");
    fin>>n>>m;
    tata[1]=0;
    for(i=2;i<=n;i++)
    {
        fin>>tata[i];
    }
    for(i=1;i<=m;i++)
    {
        fin>>u>>v;
        if(tata[u]==v)
        {
            fout<<v<<'\n';
        }
        else
        {
            if(tata[v]==u)
            {
                fout<<u<<'\n';
            }
            else
            {
                lv1=nivel(u);
                lv2=nivel(v);
                poz1=u;
                poz2=v;
                if(lv1>lv2)
                {
                    while(lv1!=lv2)
                    {
                        poz1=tata[poz1];
                        lv1--;
                    }
                }
                else
                {
                    while(lv2!=lv1)
                    {
                        poz2=tata[poz2];
                        lv2--;
                    }
                }
                while(poz1!=poz2)
                {
                    poz1=tata[poz1];
                    poz2=tata[poz2];
                }
                fout<<poz1<<'\n';
            }
        }
    }
    return 0;
}