Cod sursa(job #1919291)

Utilizator SmitOanea Smit Andrei Smit Data 9 martie 2017 18:39:51
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

int n,m;
const int H = 300;
int T2[100003],niv[100003],T[100003];
vector<int>F[100003];

void DFS(int x,int t2,int v)
{
    unsigned int i;
    int y;
    niv[x]=v;
    if(v%H==0)  t2=x;
    T2[x]=t2;
    for(i=0;i<F[x].size();++i)
    {
        y = F[x][i];
        DFS(y,t2,v+1);
    }
}

int LCA(int x,int y)
{
    while(T2[x]!=T2[y])
        if(niv[x]>niv[y])
            x=T2[x];
        else
            y=T2[y];
    while(x!=y)
        if(niv[x]>niv[y])
            x=T[x];
        else
            y=T[y];
    return x;
}

int main()
{
    int i,x,y;
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    fin>>n>>m;
    for(i=2;i<=n;++i)
    {
        fin>>T[i];
        F[T[i]].push_back(i);
    }
    DFS(1,1,1);
    for(i=1;i<=m;++i)
    {
        fin>>x>>y;
        fout<<LCA(x,y)<<"\n";
    }
    fin.close();
    fout.close();
    return 0;
}