Cod sursa(job #2151417)

Utilizator DavidLDavid Lauran DavidL Data 4 martie 2018 14:19:46
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#define MAXN 100005
#define LOGN 25
using namespace std;
ifstream fi("lca.in");
ofstream fo("lca.out");

int n,m;
int P[MAXN],depth[MAXN];
int str[LOGN][MAXN];
vector <int> G[MAXN];

void dfs(int nod)
{
    for (auto v: G[nod])
    {
        depth[v]=depth[nod]+1;
        dfs(v);
    }
}

void precalc()
{
    for (int i=1; i<=n; i++)
        str[0][i]=P[i];

    for (int b=1; (1<<b)<=n; b++)
    {
        for (int i=1; i<=n; i++)
        {
            str[b][i]=str[b-1][str[b-1][i]];
        }
    }
}

int lca(int u,int v)
{
    while (depth[u]!=depth[v])
        if (depth[u]>depth[v])
            u=P[u];
        else
            v=P[v];

    if (u==v)
        return u;

    int l=15;
    //while (str[l][u]!=str[l][v])
        //l++;
    //l--;
    //u=str[l][u],v=str[l][v];

    while (P[u]!=P[v] && l)
    {
        while (str[l][u]==str[l][v])
            l--;
        u=str[l][u],v=str[l][v];
    }
    return P[u];
}

int main()
{
    fi>>n>>m;
    for (int i=2; i<=n; i++)
    {
        fi>>P[i];
        G[P[i]].push_back(i);
    }
    dfs(1);

    precalc();

    for (int i=1; i<=m; i++)
    {
        int u,v;
        fi>>u>>v;
        fo<<lca(u,v)<<"\n";
    }

    return 0;
}