Cod sursa(job #368451)
| Utilizator | Data | 24 noiembrie 2009 21:50:11 | |
|---|---|---|---|
| Problema | Lowest Common Ancestor | Scor | Ascuns |
| Compilator | cpp | Status | done |
| Runda | Marime | 0.52 kb |
#include <cstdio>
#define MAX_N 100005
int N, M, T[MAX_N], Lev[MAX_N];
void dfs(int nod, int lev)
{
Lev[nod] = lev;
for(int i = 1; i <= N; ++i)
if(T[i] == nod)
dfs(i, lev+1);
}
int main()
{
freopen("lca.in","rt",stdin);
freopen("lca.out","wt",stdout);
scanf("%d %d\n", &N, &M);
for(int i = 2; i <= N; ++i)
scanf("%d ",T+i);
dfs(1, 0);
for(int i = 1; i <= M; ++i)
{
int x, y;
scanf("%d %d\n",&x, &y);
while(x != y)
if(Lev[x] > Lev[y])
x = T[x];
else
y = T[y];
printf("%d\n", x);
}
}
