Cod sursa(job #1184689)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 13 mai 2014 20:26:17
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<fstream>
#include<bitset>
#include<vector>
using namespace std;

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

const int Nmax=100005;

int n,m,a[Nmax],x,y,nivel[Nmax];
vector<int>v[Nmax];

inline void Citire()
{
    int i;
    fin>>n>>m;
    for (i=2;i<=n;i++)
    {
        fin>>a[i];
        v[a[i]].push_back(i);
    }
}

inline void DFS(int x,int niv)
{
    int i,len;
    nivel[x]=niv;
    len=v[x].size();
    for (i=0;i<len;i++)
        DFS(v[x][i],niv+1);
}

inline void Rezolva()
{
    int i;
    while (m--)
        {
            fin>>x>>y;
            while (nivel[x]>nivel[y])
                x=a[x];
            while (nivel[y]>nivel[x])
                y=a[y];
            while (x!=y)
                {
                    x=a[x];
                    y=a[y];
                }
            fout<<x<<"\n";
        }
}

int main()
{
    Citire();
    DFS(1,1);
    Rezolva();
    return 0;
}