Cod sursa(job #2368961)

Utilizator ianiIani Biro iani Data 5 martie 2019 20:07:11
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

int euler[1000000],neuler=1,nivel[1000000];

struct nod
{
    int fiu;
    nod* next;
}*a[100005];

void dfs(int x,int niv)
{
    euler[neuler]=x;
    nivel[neuler++]=niv;
    for (nod *i=a[x];i;i=i->next)
    {
        dfs(i->fiu,niv+1);
        euler[neuler]=x;
        nivel[neuler++]=niv;
    }
}

int rez(int x,int y)
{
    bool ok=false;
    int nod=1,mini=2000000000,ant=-1;
    for (int i=1;i<=neuler;i++)
    {
        if ((euler[i]==x||euler[i]==y)&&euler[i]!=ant)
        {
            ant=euler[i];
            if (ok==true)
            {
                if (mini>nivel[i])
                {
                    mini=nivel[i];
                    nod=euler[i];
                }
                break;
            }
            ok=true;
        }
        if (ok&&mini>nivel[i])
        {
            mini=nivel[i];
            nod=euler[i];
        }
    }
    return nod;
}

int main()
{
    int n,m;
    fin>>n>>m;
    for(int i=1;i<n;i++)
    {
        int x;
        fin>>x;
        nod* nou=new nod;
        nou->fiu=i+1;
        nou->next=a[x];
        a[x]=nou;
    }
    dfs(1,0);
    for (int i=0;i<m;i++)
    {
        int x,y;
        fin>>x>>y;
        fout<<rez(x,y)<<'\n';
    }
    return 0;
}