Cod sursa(job #2607315)

Utilizator victor1306Victor Mihaila victor1306 Data 29 aprilie 2020 16:40:04
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

using namespace std;
const int M=4000005;
const int N=100005;
const int L=17;

ifstream cin("lca.in");
ofstream cout("lca.out");

int vf[M], urm[M], lst[N], nr,ti[N], to[N], t[17][N], timp,n;
void adauga(int x, int y){
    vf[++nr]=y;
    urm[nr]=lst[x];
    lst[x]=nr;
}
int lca(int x, int y){
    if(ti[x]<=ti[y]&&to[y]<=to[x]){
        return x;
    }
    int pas=L-1;
    while(pas>=0){
        int s=t[pas][x];
        if(s!=0&&(ti[s]>ti[y]||to[y]>to[s])){
            x=s;
        }
        pas--;
    }
    return t[0][x];
}
void dfs(int x){
    ti[x]=++timp;
    for(int p=lst[x];p!=0;p=urm[p]){
        int y=vf[p];
        if(ti[y]==0){
            dfs(y);
            t[0][y]=x;
        }
    }
    to[x]=++timp;
}

int main()
{
    int n,m,x,y;
    cin>>n>>m;
    for(int i=2;i<=n;i++){
        cin>>x;
        adauga(x,i);
    }
    dfs(1);
     for(int i=1;i<L;i++){
        for(int j=1;j<=n;j++){
            t[i][j]=t[i-i][t[i-1][j]];
        }
    }
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        cout<<lca(x,y)<<'\n';
    }
    return 0;
}