Cod sursa(job #2565448)

Utilizator maria15Maria Dinca maria15 Data 2 martie 2020 14:15:02
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int n, a, b, t[100002], niv[100003], m, i, st, dr, mid, doi[100002], sol[100003][7], dif;
vector<int> v[100002];

void dfs(int nod, int nivel){
    niv[nod] = nivel;
    for(int i = 0;i<v[nod].size();i++){
        int vecin = v[nod][i];
        int put = doi[vecin];
        for(int j=1;j<=put;j*=2)
            sol[vecin][j] = sol[nod][j]+1;
        dfs(vecin, nivel+1);
    }
}
/*
int main(){
    fin>>n>>m;
    for(i=2;i<=n;i++){
        fin>>t[i];
        v[t[i]].push_back(i);
    }

    int ant;
    doi[1] = ant = 0;   ///  cea mai mare putere de doi <= i
    for(i=2;i<=n;i++){
        if((1<<(ant+1)) > i)
            doi[i] = ant;
        else    dfs(1, 1);
            doi[i] = ant+1, ant++;
    }
        dfs(1, 1);
    for(i=1;i<=m;i++){
        fin>>a>>b;
        while(niv[a] > niv[b]){
            a = t[a];
        }
        while(niv[b] > niv[a]){
            b = t[b];
        }
        /// acum, a si b sunt la acelasi nivel
        dif = niv[a] - 1;
        mid = doi[dif];
        st = niv[a];
        dr = 1;
        while(dr<=st){
            if(sol[a][mid] == sol[b][mid]){
                st = niv[a]-mid;
                dif = niv[a]-dr;
                mid = doi[dif];
            }
            else{

            }
                a=sol[a][mid], b = sol[b][mid], mid = doi[niv[a]-dr], dif = a-dr, st = niv[a];
        }
        fout<<dr<<"\n";

    }
    return 0;
}*/


int main(){
    fin>>n>>m;
    for(i=2;i<=n;i++){
        fin>>t[i];
        v[t[i]].push_back(i);
    }
    dfs(1, 1);
    for(i=1;i<=m;i++){
        fin>>a>>b;
        while(niv[a] > niv[b]){
            a = t[a];
        }
        while(niv[b] > niv[a]){
            b = t[b];
        }
        while(a!=b){
            a = t[a];
            b = t[b];
        }
        fout<<a<<"\n";
    }


    return 0;
}