Cod sursa(job #2470441)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 9 octombrie 2019 10:55:40
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
using namespace std;

/// lowest common ancestor
int n,s;
const int NMAX=100000;
int parent[NMAX+5],sqparent[NMAX+5],depth[NMAX+5];
vector<int>v[NMAX+5];
void dfs(int nod)
{
    vector<int>::iterator it;
    for(it=v[nod].begin();it!=v[nod].end();it++)
    {
        depth[*it]=depth[nod]+1;
        dfs(*it);
    }
}
int naivelca(int u ,int v)
{
    if(depth[u]>depth[v])swap(u,v);
    if(depth[u]==depth[v])
    {
        if(u==v)return u;
        u=parent[u];
        v=parent[v];
        return naivelca(u,v);
    }
    v=parent[v];
    return naivelca(u,v);
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    int m,n,i,j;
    scanf("%d%d",&m,&n);
    for(i=2;i<=m;i++)
        {scanf("%d",&parent[i]);v[parent[i]].push_back(i);}
        dfs(1);
        parent[1]=0;
        depth[0]=-1;
    for(i=1;i<=n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        int ans=naivelca(x,y);
        printf("%d\n",ans);
    }
    return 0;
}