Pagini recente » Cod sursa (job #1574841) | Cod sursa (job #1284958) | Cod sursa (job #2235752) | Cod sursa (job #394497) | Cod sursa (job #2581864)
#include <bits/stdc++.h>
#define MAX 100100
#define MAX2 200100
#define LOGG 21
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int>g[MAX];
int euler[MAX2],level[MAX2],ind[MAX];
int c[MAX2][LOGG];
bool uz[MAX];
int n,m,nr=1,lvl=0;
void rd();
void dfs(int node);
void rmq();
int main()
{
int i,k,x,y;
rd();
uz[1]=1;
dfs(1);
rmq();
for(i=1;i<=m;i++)
{
fin>>x>>y;
if(ind[x]>ind[y])
swap(x,y);
k=log2(ind[y]-ind[x]+1);
if(level[c[ind[x]][k]]<level[c[ind[y]-(1<<k)+1][k]])
fout<<euler[c[ind[x]][k]]<<'\n';
else
fout<<euler[c[ind[y]-(1<<k)+1][k]]<<'\n';
}
return 0;
}
void rd()
{
int i,x;
fin>>n>>m;
for(i=1;i<n;i++)
{
fin>>x;
g[x].push_back(i+1);
g[i+1].push_back(x);
}
}
void dfs(int node)
{
int i;
euler[nr]=node;
level[nr]=lvl;
if(!ind[node])
ind[node]=nr;
nr++;
for(i=0;i<g[node].size();i++)
if(!uz[g[node][i]])
{
uz[g[node][i]]=1;
lvl++;
dfs(g[node][i]);
lvl--;
euler[nr]=node;
level[nr]=lvl;
nr++;
}
}
void rmq()
{
int n1,i,j;
n1=2*n-1;
for(i=1;i<=n1;i++)
c[i][0]=i;
for(j=1;(1<<j)<=n1;j++)
for(i=1;i+(1<<j)-1<=n1;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];
}