Cod sursa(job #1919470)

Utilizator SmitOanea Smit Andrei Smit Data 9 martie 2017 19:36:51
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>
#define H 300

using namespace std;

int n,m;
int T[100003],niv[100003],T2[100003];
vector<int>L[100003];

void DFS(int x,int t2,int v)
{
    int y;
    unsigned int i;
    niv[x]=v;
    T2[x]=t2;
    if(v%H==0)  t2=x;
    for(i=0;i<L[x].size();++i)
    {
        y=L[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>>x;
        T[i]=x;
        L[x].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;
}