Pagini recente » Cod sursa (job #2543933) | Cod sursa (job #1213490) | Cod sursa (job #1159324) | Cod sursa (job #1509751) | Cod sursa (job #410441)
Cod sursa(job #410441)
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 100002
vector <int> F[NMAX];
short Niv[NMAX];
int T[NMAX][20];
void dfs(int nod, short niv)
{
Niv[nod]=niv;
for (int i=0;i<F[nod].size();++i)
dfs(F[nod][i],niv+1);
}
int lca(int x, int y)
{
if (Niv[x]<Niv[y]) swap(x,y);
int log1,log2;
for (log1=0; (1<<log1)<Niv[x];++log1);
for (log2=0; (1<<log2)<Niv[x];++log2);
int k;
for (k=log1;k>=0;--k)
if (Niv[x]-(1<<k) >= Niv[y]) x=T[x][k];
if (x==y) return x;
for (k=log2;k>=0;--k)
if (T[x][k] && T[x][k]!=T[y][k])
{
x=T[x][k];
y=T[y][k];
}
return T[x][0];
}
int main()
{
ifstream fin("lca.in"); ofstream fout("lca.out");
int n,m,i;
fin>>n>>m;
for (i=2;i<=n;++i)
{
fin>>T[i][0];
F[T[i][0]].push_back(i);
}
for(int k = 1; (1 << k)<=n; ++k)
for(i = 1; i<=n; ++i)
T[i][k] = T[T[i][k-1]][k-1];
dfs(1,0);
while (m--)
{ int x,y;
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
fin.close(); fout.close();
return 0;
}