Cod sursa(job #2374663)

Utilizator Vlad3108Tir Vlad Ioan Vlad3108 Data 7 martie 2019 19:52:03
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;
#define LMAX 100005
vector<int> G[LMAX];
int n,T[LMAX][20];
int Niv[LMAX];
void dfs(int nod,int niv){
    Niv[nod]=niv;
    for(auto it : G[nod])
        dfs(it,niv+1);
}
void precalc(){
    for(int j=1;(1<<j)<=n;++j)
        for(int i=1;i<=n;++i)
            T[i][j]=T[T[i][j-1]][j-1];
}
int lca(int a,int b){
    if(Niv[a]>Niv[b])
        swap(a,b);
    int log2_a=0,log2_b=0;
    for(;(1<<log2_a)<Niv[a];++log2_a);
    for(;(1<<log2_b)<Niv[b];++log2_b);
    for(;log2_b>=0;--log2_b)
        if(Niv[b]-(1<<log2_b)>=Niv[a])
            b=T[b][log2_b];
    if(a==b)
        return a;
    for(;log2_a>=0;--log2_a)
        if(T[a][log2_a]!=0&&T[a][log2_a]!=T[b][log2_a]){
            a=T[a][log2_a];
            b=T[b][log2_a];
        }
    return T[a][0];
}
#define BUFF_SIZE (1<<12)
char buff[BUFF_SIZE];
int poz=BUFF_SIZE;
char GetChar(){
    if(poz==BUFF_SIZE){
        fread(buff,1,BUFF_SIZE,stdin);
        poz=0;
    }
    return buff[poz++];
}
int GetInt(){
    int n=0;
    char c;
    do{
        c=GetChar();
    }while(!isdigit(c));
    do{
        n=n*10+c-'0';
        c=GetChar();
    }while(isdigit(c));
    return n;
}
int main(){
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    int q;
    n=GetInt();
    q=GetInt();
    for(int i=2;i<=n;++i){
        T[i][0]=GetInt();
        G[T[i][0]].push_back(i);
    }
    dfs(1,0);
    precalc();
    while(q--){
        int x,y;
        x=GetInt();
        y=GetInt();
        printf("%d\n",lca(x,y));
    }
    return 0;
}