Pagini recente » Cod sursa (job #85664) | Cod sursa (job #975958) | Cod sursa (job #2726857) | Cod sursa (job #154360) | Cod sursa (job #2394874)
#include <bits/stdc++.h>
#define NMAX 100005
#define LMAX 20
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> G[NMAX];
int tata[NMAX];
int M[2*NMAX][LMAX];
int n,m;
int euler[2*NMAX],lg;
int level[2*NMAX];
int index[NMAX];
int h[NMAX];
bool uz[NMAX];
void citire();
void parcurgere_euler();
void dfs(int x);
void constr();
void rezolv();
int main()
{citire();
parcurgere_euler();
constr();
rezolv();
/*for(i=1;i<=m;i++)
{fin>>x>>y;
fout<<euler[RMQ(index[x],index[y])]<<'\n';
}*/
}
void citire()
{int i;
fin>>n>>m;
for(i=1;i<n;i++)
{fin>>tata[i];
G[i+1].push_back(tata[i]);
G[tata[i]].push_back(i+1);
}
}
void parcurgere_euler()
{dfs(1);
}
void dfs(int x)
{int i;
uz[x]=1;
lg++;
euler[lg]=x;
level[lg]=h[x];
if(!index[x])
index[x]=lg;
for(i=0;i<G[x].size();i++)
if(!uz[G[x][i]])
{h[G[x][i]]=h[x]+1;
dfs(G[x][i]);
lg++;
euler[lg]=x;
level[lg]=h[x];
}
}
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)<=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 rezolv()
{int i,k,x,y;
for(i=1;i<=m;i++)
{fin>>x>>y;
x=index[x];
y=index[y];
if(x<y)
swap(x,y);
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';
}
}