Cod sursa(job #1335701)

Utilizator raulmuresanRaul Muresan raulmuresan Data 5 februarie 2015 20:22:19
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int Nmax = 100000 + 2;

vector <int> v[Nmax];
int lev[Nmax];
int tata[Nmax];
int n,m,i,x,y;
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int nod,int level)
{
    int i;
    lev[nod]=level;
    for(i=0;i<v[nod].size();i++)
    {
        if(tata[v[nod][i]]==0)
        {
            tata[v[nod][i]]=nod;
            dfs(v[nod][i],level+1);
        }
    }
}
int lca(int x,int y)
{
    while(x!=y)
    {
        if(lev[x]>lev[y])
        {
            x=tata[x];
        }
        else
        {
            y=tata[y];
        }
    }
    return x;
}

int main()
{
    fin>>n>>m;
    for(i=2;i<=n;i++)
    {
        fin>>x;
        v[x].push_back(i);
    }
    dfs(1,1);

    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<lca(x,y)<<"\n";
    }

   /* for(i=1;i<=n;i++)
    {
        fout<<lev[i]<<" ";
    }*/
}