Pagini recente » Cod sursa (job #2227574) | Cod sursa (job #1465387) | Cod sursa (job #3294858) | Cod sursa (job #3030939) | Cod sursa (job #1548640)
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100002
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, p[21][MAXN], D[MAXN];
void pre(){
int i, j;
for(i=1; i<=20; ++i)
for(j=1; j<=n; ++j)
p[i][j]=p[i-1][p[i-1][j]];
}
int query(int a, int b){
if(D[a]<D[b]) swap(a, b);
int delta=D[a]-D[b];
for(int i=0; (1<<i)<=delta; ++i)
if((delta>>i)&1)
a=p[i][a];
if(a==b) return a;
for(int i=20; i>=0; --i)
if(p[i][a]!=p[i][b])
a=p[i][a], b=p[i][b];
return p[0][a];
}
int main ()
{
fin>>n>>m;
int i, a, b;
for(i=1; i<n; ++i){
fin>>a;
D[i+1]=D[a]+1;
p[0][i+1]=a;
}
while(m--){
fin>>a>>b;
fout<<query(a, b)<<'\n';
}
return 0;
}