Cod sursa(job #1688333)

Utilizator firutibogdanFiruti Bogdan-Cristian firutibogdan Data 13 aprilie 2016 13:34:37
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
using namespace std;
int i,n,m,tata[100002],u,v,poz1,poz2,lv1,lv2,nv[100002];
void nivel(int x)
{
    int lv=0;
    if(nv[tata[x]]!=0)
    {
        nv[x]=nv[tata[x]]+1;
    }
    else
    {
        while(tata[x]!=0)
        {
            x=tata[x];
            lv++;
        }
        nv[x]=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];
    }
    nv[1]=1;
    for(i=2;i<=n;i++)
    {
        nivel(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=nv[u];
                lv2=nv[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;
}