Pagini recente » Cod sursa (job #1715389) | Cod sursa (job #599872) | Cod sursa (job #277862) | Cod sursa (job #1471174) | Cod sursa (job #2416797)
#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,cate;
vector <int> g[NMAX];
int ind[NMAX];
int euler[2*NMAX];
bool uz[NMAX];
int M[2*NMAX][30];
int level[2*NMAX];
//int h[NMAX];
void citire();
void dfs(int k, int niv);
void constr();
void quest();
int main()
{citire();
dfs(1,1);
constr();
quest();
return 0;
}
void citire()
{int i,tata;
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>tata;
g[tata].push_back(i);
g[i].push_back(tata);
}
}
void dfs(int k ,int niv)
{int i;
cate++;
euler[cate]=k;
level[cate]=niv;
if(!ind[k])
ind[k]=cate;
uz[k]=1;
for(i=0;i<g[k].size();i++)
if(!uz[g[k][i]])
{
dfs(g[k][i],niv+1);
euler[++cate]=k;
level[cate]=niv;
}
}
void constr()
{
int i,j;
for(i=1;i<=2*n-1;i++)
M[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[M[i][j-1]]<level[ M[i+(1<<(j-1))][j-1] ])
M[i][j]=M[i][j-1];
else
M[i][j]=M[i+(1<<(j-1))][j-1];
}
void quest()
{int x,y;
int i;
for(i=1;i<=m;i++)
{
fin>>x>>y;
x=ind[x];
y=ind[y];
if(x<y)
swap(x,y);
int k=log2(x-y+1);
if(level[M[y][k]]<level[M[x-(1<<k)+1][k]])
fout<<euler[M[y][k]]<<'\n';
else
fout<<euler[M[x-(1<<k)+1][k]]<<'\n';
}
}