Pagini recente » Cod sursa (job #2294098) | Cod sursa (job #1981264) | Cod sursa (job #429080) | Cod sursa (job #2385864) | Cod sursa (job #1279753)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[100005];
int n,m,dad[100005],niv[100005],dp[100005][18];
int DFS(int nod,int lv)
{ int i;
dp[nod][0]=dad[nod];
for(i=1;(1<<i)<lv;i++)
dp[nod][i]=dp[dp[nod][i-1]][i-1];
niv[nod]=lv;
for(i=0;i<v[nod].size();i++)
DFS(v[nod][i],lv+1);
}
int LCA(int x,int y)
{ int i,scad;
if (niv[x]<niv[y]) swap(x,y);
scad=niv[x]-niv[y];
for(i=18;i>=0;i--)
if (niv[x]-(1<<i)>=niv[y])
x=dp[x][i];
if (x==y) return x;
for(i=18;i>=0;i--)
if (niv[x]-(1<<i)>=1 && dp[x][i]!=dp[y][i])
{ x=dp[x][i]; y=dp[y][i]; }
return dad[x];
}
int main()
{ int i,x,y;
f>>n>>m;
for(i=2;i<=n;i++)
{ f>>dad[i];
v[dad[i]].push_back(i);
}
DFS(1,1);
for(i=1;i<=m;i++)
{ f>>x>>y;
g<<LCA(x,y)<<"\n";
}
return 0;
}