Pagini recente » Cod sursa (job #35769) | Cod sursa (job #2150261) | Cod sursa (job #1520031) | Cod sursa (job #1498372) | Cod sursa (job #2332470)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> v[100010];
int n,M,nivel[100010],k,m[20][200020],log[200020],N,e,poz[100010],dif;
void dfs(int nod,int grad)
{
k++;
m[1][k]=nod;
poz[nod]=k;
nivel[nod]=grad;
for(auto it:v[nod])
{
dfs(it,grad+1);
k++;
m[1][k]=nod;
}
}
int main()
{
int i,j,val,x,y;
fin>>n>>M;
for(i=2; i<=n; i++)
{
fin>>val;
v[val].push_back(i);
}
dfs(1,1);
log[1]=0;
for(i=2;i<=2*n-1;i++)
log[i]=log[i/2]+1;
N=log[2*n-1];
e=2*n-1;
for(i=2;i<=N;i++)
{
for(j=1;j<=e+1-(1<<(i-1));j++)
{
if(nivel[m[i-1][j]]>nivel[m[i-1][j+(1<<(i-2))]])
m[i][j]=m[i-1][j+(1<<(i-2))];
else
m[i][j]=m[i-1][j];
}
}
for(i=1;i<=M;i++)
{
fin>>x>>y;
if(poz[x]>poz[y])
swap(x,y);
dif=poz[y]-poz[x];
dif=log[dif];
if(nivel[m[dif+1][poz[x]]]>nivel[m[dif+1][poz[y]+1-(1<<dif)]])
fout<<m[dif+1][poz[y]+1-(1<<dif)]<<'\n';
else
fout<<m[dif+1][poz[x]]<<'\n';
}
}