Pagini recente » Cod sursa (job #100529) | Cod sursa (job #1198981) | Cod sursa (job #1586582) | Cod sursa (job #1236779) | Cod sursa (job #3344836)
#include <fstream>
#include <vector>
#define NMAX 100002
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,tata[NMAX],nivel[NMAX],up[NMAX][18];
vector<int> tree[NMAX];
void citire()
{
fin>>n>>m;
for(int i=2; i<=n; i++)
{
fin>>tata[i];
tree[tata[i]].push_back(i);
}
}
void DFS(int nod)
{
for(int i=0; i<tree[nod].size(); i++)
{
int next_nod=tree[nod][i];
nivel[next_nod]=nivel[nod]+1;
up[next_nod][0]=nod;
for(int j=1; j<=17; j++)
{
up[next_nod][j]=up[up[next_nod][j-1]][j-1];
}
DFS(next_nod);
}
}
int lca(int a, int b)
{
if(nivel[b]>nivel[a])
{
swap(a,b);
}
int k=nivel[a]-nivel[b];
for(int j=17; j>=0; j--)
{
if(k&(1<<j))
{
a=up[a][j];
}
}
if(a==b)
{
return a;
}
for(int j=17; j>=0; j--)
{
if(up[a][j]!=up[b][j])
{
a=up[a][j];
b=up[b][j];
}
}
return up[a][0];
}
int main()
{
citire();
DFS(1);
int a,b;
for(int i=1; i<=m; i++)
{
fin>>a>>b;
fout<< lca(a,b) << "\n";
}
return 0;
}