Pagini recente » Cod sursa (job #1406886) | Borderou de evaluare (job #1008204) | Borderou de evaluare (job #2041341) | Cod sursa (job #642401) | Cod sursa (job #1173226)
#include <cstdio>
#include <vector>
using namespace std;
const int NMAX = 100010;
int N, M, X, Y, First[NMAX], Last[NMAX], K, Ancestor[18][NMAX];
vector<int> G[NMAX];
void DFS(int Node, int Father)
{
First[Node] = ++ K;
Ancestor[0][Node] = Father;
for(vector<int> :: iterator it = G[Node].begin(); it != G[Node].end(); ++ it)
DFS(*it, Node);
Last[Node] = ++ K;
}
bool Anc(int X, int Y)
{
return First[X] <= First[Y] && Last[Y] <= Last[X];
}
int GetLCA(int X, int Y)
{
if(Anc(X, Y)) return X;
for(int Step = 17; Step >= 0; Step --)
if(Ancestor[Step][X] && !Anc(Ancestor[Step][X], Y))
X = Ancestor[Step][X];
return Ancestor[0][X];
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%i %i", &N, &M);
for(int i = 2; i <= N; ++ i)
{
scanf("%i", &X);
G[X].push_back(i);
}
DFS(1, 0);
for(int i = 1; i <= 17; ++ i)
for(int j = 1; j <= N; ++ j)
Ancestor[i][j] = Ancestor[i - 1][Ancestor[i - 1][j]];
for(; M; M --)
{
scanf("%i %i", &X, &Y);
printf("%i\n", GetLCA(X, Y));
}
}