Pagini recente » Cod sursa (job #2006896) | Cod sursa (job #365730) | Cod sursa (job #767751) | Cod sursa (job #2823948) | Cod sursa (job #1755765)
#include <fstream>
#include <vector>
using namespace std;
const int NMAX=100005;
int nr, l;
int rmq[20][NMAX<<1], vis[NMAX], first[NMAX], euler[NMAX], log2[NMAX<<1];
vector<int> g[NMAX];
void dfs(int node, int f)
{
vis[node]=vis[f]+1;
euler[++nr]=node;
first[node]=nr;
for(int i=0; i<g[node].size(); i++)
{
dfs(g[node][i], node);
euler[++nr]=node;
}
}
int main()
{
ifstream in("lca.in");
ofstream out("lca.out");
int n, m;
in>>n>>m;
for(int i=1; i<n; i++)
{
int x;
in>>x;
g[x].push_back(i+1);
}
dfs(1, 0);
log2[1]=0;
for(int i=2; i<=nr; i++)
log2[i]=log2[i/2]+1;
for(int i=1; i<=nr; i++)
rmq[0][i]=euler[i];
for(int i=1; (1<<i)<=nr; i++)
for(int j=1; j<=nr-(1<<i)+1; j++)
{
int l=(1<<(i-1));
if(vis[rmq[i-1][j]]<vis[rmq[i-1][j+l]])
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+l];
}
for(int i=1; i<=m; i++)
{
int u, v;
in>>u>>v;
u=first[u];
v=first[v];
if(u>v)
swap(u, v);
int diff=v-u+1;
l=log2[diff];
if(vis[rmq[l][u]]<vis[rmq[l][v-(1<<l)+1]])
out<<rmq[l][u]<<'\n';
else
out<<rmq[l][v-(1<<l)+1]<<'\n';
}
return 0;
}