Pagini recente » Cod sursa (job #2397506) | Istoria paginii runda/de_vacanta | Cod sursa (job #2356515) | Cod sursa (job #13338) | Cod sursa (job #2951002)
#include <fstream>
#include <vector>
#define pb push_back
using namespace std;
using vi=vector<int>;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int N=1e5+2;
const int L=17;
int niv[N],up[N][L+1];
int n,m,i;
vi adj[N];
void dfs(int nod,int tata){
for(int i=1; i<=L; i++)
up[nod][i]=up[up[nod][i-1]][i-1];
for(auto i:adj[nod])
if(i!=tata)
{
niv[i]=niv[nod]+1;
up[i][0]=nod;
dfs(i,nod);
}
}
int lca(int x,int y){
if(niv[x]<niv[y])
swap(x,y);
for(int i=L; i>=0; i--)
if(up[x][i] && niv[up[x][i]]>=niv[y])
x=up[x][i];
if(x==y)
return x;
for(int i=L; i>=0; i--)
if(up[x][i] && up[y][i] && up[x][i]!=up[y][i])
{
x=up[x][i];
y=up[y][i];
}
return up[x][0];
}
int main()
{
fout<<0;
fin>>n>>m;
for(i=2; i<=n; i++)
{
int x;
fin>>x;
adj[x].pb(i);
adj[i].pb(x);
}
dfs(1,0);
for(i=1; i<=m; i++)
{
int x,y;
fin>>x>>y;
fout<<lca(x,y)<<'\n';
}
}