Cod sursa(job #2948414)

Utilizator TraianQTraianQ TraianQ Data 27 noiembrie 2022 18:17:30
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <bits/stdc++.h>
using namespace std;
int v[100005],v2[100005],level[100005];
vector <int> V[100005];
void DFS(int k,int k1,int niv)
{
    level[k]=niv;
    v2[k]=k1;
    if(niv%300==0)
        k1=k;
    for(auto x:V[k])
    {
        DFS(x,k,niv+1);
    }
}
int main()
{
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    int n,Q,a,b;
    fin>>n>>Q;
    for(int i=2;i<=n;i++)
    {
        fin>>v[i];
        V[v[i]].push_back(i);
    }
    DFS(1,1,0);
    while(Q--)
    {
        fin>>a>>b;
        while(v2[a]!=v2[b])
        {
            if(level[a]>level[b])
                a=v2[a];
            else
                b=v2[b];
        }
        while(a!=b)
        {
            if(level[a]>level[b])
                a=v[a];
            else
                b=v[b];
        }
        fout<<a<<'\n';
    }
    return 0;
}