Pagini recente » Cod sursa (job #2387245) | Cod sursa (job #915751) | Cod sursa (job #823138) | Cod sursa (job #554866) | Cod sursa (job #2409136)
#include <bits/stdc++.h>
#define MAX 100100
#define LOGMAX 20
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int>g[MAX];
bool uz[MAX];
int c[2*MAX][LOGMAX];
int level[2*MAX];
int euler[2*MAX];
int ind[MAX];
int n,m,nr=1,lg=1;
void repeuler(int node);
void read();
void process();
void query();
int main()
{
int i;
read();
process();
query();
return 0;
}
void read()
{
int i,x;
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>x;
g[x].push_back(i);
g[i].push_back(x);
}
repeuler(1);
}
void repeuler(int node)
{
int i;
uz[node]=1;
euler[nr]=node;
level[nr]=lg;
if(!ind[node])
ind[node]=nr;
nr++;
for(i=0;i<g[node].size();i++)
if(!uz[g[node][i]])
{
lg++;
repeuler(g[node][i]);
lg--;
euler[nr]=node;
level[nr]=lg;
nr++;
}
}
void process()
{
int i,j;
for(i=1;i<=2*n-1;i++)
c[i][0]=i;
for(j=1;(1<<j)<=2*n-1;j++)
for(i=1;i+(1<<j)-1<=2*n-1;i++)
if(level[c[i][j-1]]<level[c[i+(1<<j-1)][j-1]])
c[i][j]=c[i][j-1];
else
c[i][j]=c[i+(1<<j-1)][j-1];
}
void query()
{
int i,k,x,y;
for(i=1;i<=m;i++)
{
fin>>x>>y;
x=ind[x];y=ind[y];
if(x>y)
swap(x,y);
k=log2(y-x+1);
if(level[c[x][k]]<level[c[y-(1<<k)+1][k]])
fout<<euler[c[x][k]]<<'\n';
else
fout<<euler[c[y-(1<<k)+1][k]]<<'\n';
}
}