Pagini recente » Cod sursa (job #1786504) | Cod sursa (job #1405655) | Cod sursa (job #3129763) | Cod sursa (job #2821361) | Cod sursa (job #1319583)
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;
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() {
ifstream f("lca.in");
ofstream g("lca.out");
f>>n>>m;
for(int i=2; i<=n; i++) f>>parent[i];
level[1] = 1;
for(int i=2; i<=n; i++) explore(i);
for(int i=1; i<=m; i++) {
f>>x>>y;
g<<lca(x, y)<<"\n";
}
/*
for(int h=1; h<=4; h++) {
for(int i=1; i<=n; i++)
if(level[i] == h) cout<<i<<" ";
cout<<"\n";
}
*/
return 0;
}