Cod sursa(job #2565438)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 2 martie 2020 14:14:16
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define dim 100005

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m;
int d[dim],i,t[31][dim],x,y;
vector <int> L[dim];
bitset<dim> fr;
void dfs(int nod){
    fr[nod]=1;
    for(auto it:L[nod]){
        if(fr[it]==0){
            d[it]=d[nod]+1;
            dfs(it);
        }
    }
}
int verif(int x,int dx){
    int put=0;
    int ta=x;
   // cout<<x<<" "<<dx<<" ";
    while(dx){
        if(dx%2==1){
           ta=t[put][ta];
        }
        put++;
        dx/=2;
    }
return ta;
}
void query(int x,int y){
int lx=d[x];
int ly=d[y];
int st=0,dr=min(lx,ly)+1,mid;
while(st<=dr){
       // cout<<st<<" "<<dr<<endl;
    mid=(st+dr)/2;
    if(verif(x,lx-mid)==verif(y,ly-mid))
        st=mid+1;
    else dr=mid-1;
}

fout<<verif(y,ly-dr)<<"\n";
}
int main()
{
   fin>>n>>m;
   for(i=2;i<=n;i++){
    fin>>x; /// de lungime 2^0 de i
    t[0][i]=x;
    L[x].push_back(i);
    L[i].push_back(x);
   }
   dfs(1);
   int la=(1<<29);
   for(int l=1;l<=29;l++){
       //cout<<1;
       int put=(1<<l);
        for(int nod=1;nod<=n;nod++){
            t[l][nod]=t[l-1][t[l-1][nod]];
        }
   }
   for(i=1;i<=m;i++){
    fin>>x>>y;
    query(x,y);
   }
}