Pagini recente » Cod sursa (job #125972) | Cod sursa (job #10714) | Cod sursa (job #2415280) | Cod sursa (job #465536) | Cod sursa (job #1326129)
#include <iostream>
#include<fstream>
#define nmax 10005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, x, y, parent[nmax], level[nmax];
void explore(int x)
{ if(level[x]) return;
explore(parent[x]);
level[x]=level[parent[x]]+1;
}
int lca(int x, int y)
{ while(level[x]>level[y]) x=parent[x];
while(level[y]>level[x]) y=parent[y];
while(x!=y)
{ x=parent[x];
y=parent[y]; }
return x;
}
int main()
{ f>>n>>m;
for(int i=2; i<=n; i++) f>>parent[i];
level[1]=1;
for(int i=1; i<=n; i++) explore(i);
for(int i=1; i<=m; i++) {
f>>x>>y;
g<<lca(x,y)<<"\n"; }
return 0;
}