Pagini recente » Cod sursa (job #54433) | Cod sursa (job #2629503) | Cod sursa (job #2105451) | Cod sursa (job #2188747) | Cod sursa (job #2229876)
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
int n, m, t[nmax], a[nmax][20], niv[nmax];
vector<int> v[nmax];
fstream f1("lca.in", ios::in);
fstream f2("lca.out", ios::out);
///a[i][j]=al 2^j-lea stramos al nodului i
void din()
{
int i, j;
for(i=1; i<=n; i++)
a[i][0]=t[i];
for(j=1; j<=log2(n); j++)
for(i=1; i<=n; i++)
a[i][j]=a[a[i][j-1]][j-1];
}
int lca(int x, int y)
{
int j;
if(niv[y]< niv[x]) swap(x, y);
for(j=log2(n); j>=0; j--)
if(niv[a[y][j]]>= niv[x]) y=a[y][j];
if(x==y) return x;
for(j=log2(n); j>=0; j--)
if(a[x][j]!=a[y][j]) {x=a[x][j]; y=a[y][j];}
return t[x];
}
void dfs(int nod)
{
niv[nod]=niv[t[nod]]+1;
for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
if(*it!=t[nod])
dfs(*it);
}
int main()
{
int i, x, y;
f1>>n>>m;
for(i=2; i<=n; i++)
{
f1>>t[i];
v[i].push_back(t[i]); v[t[i]].push_back(i);
}
din();
dfs(1);
for(i=1; i<=m; i++)
{
f1>>x>>y;
f2<<lca(x, y)<<"\n";
}
return 0;
}