Pagini recente » Cod sursa (job #2771351) | Cod sursa (job #536963) | Cod sursa (job #1027120) | Cod sursa (job #2836817) | Cod sursa (job #1078168)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int n_max=100002;
const int log_n_max=18;
int n, m, i, x, y, k, level[n_max], e[2*n_max+4], ap[n_max], rm[log_n_max][n_max];
vector<int> a[n_max];
void dfs(int nod)
{
int i;
e[++k]=nod;
ap[nod]=k;
for(i=0; i<a[nod].size(); i++)
{
dfs(a[nod][i]);
e[++k]=nod;
}
}
void RMQ()
{
int i, j;
for(j=1; j<=k; j++)
rm[0][j]=j;
for(i=1; (1<<i)<=k; i++)
for(j=1; j+(1<<i)-1<=k; j++)
if(level[e[rm[i-1][j]]] <= level[e[rm[i-1][j+(1<<(i-1))]]])
rm[i][j]=rm[i-1][j];
else
rm[i][j]=rm[i-1][j+(1<<(i-1))];
}
int LCA(int x, int y)
{
int k;
if(x>y) swap(x, y);
k=log2(y-x+1);
if(level[e[rm[k][x]]] < level[e[rm[k][y-(1<<k)+1]]])
return rm[k][x];
return rm[k][y-(1<<k)+1];
}
int main()
{
cin>>n>>m;
for(i=2; i<=n; i++)
{
cin>>x;
a[x].push_back(i);
level[i]=level[x]+1;
}
dfs(1);
RMQ();
while(m--)
{
cin>>x>>y;
cout<<e[LCA(ap[x], ap[y])]<<'\n';
}
return 0;
}