Pagini recente » Cod sursa (job #2384917) | Cod sursa (job #665159) | Cod sursa (job #3187375) | Cod sursa (job #2479308) | Cod sursa (job #1307565)
#define IA_PROB "lca"
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <fstream>
using namespace std;
class Tree {
private:
int root;
vector< vector<int> > children;
int simple_lca_On(int i, int x, int y) {
int ret = (i == x || i == y) ? i : 0;
for (vector<int>::iterator c = children[i].begin(); c != children[i].end(); c++) {
int child_ret = simple_lca_On(*c, x, y);
if (child_ret > 0) {
if (ret == 0) {
ret = child_ret;
} else {
return i;
}
}
}
return ret;
}
public:
Tree(int n, int *p) {
children.resize(n + 1, vector<int>());
for (int i = 1; i <= n; i++) {
if (p[i] == i) {
root = i;
} else {
children[p[i]].push_back(i);
}
}
}
int lca(int x, int y) {
return simple_lca_On(root, x, y);
}
};
int main()
{
ifstream in(IA_PROB".in");
ofstream out(IA_PROB".out");
int n, m;
in>>n>>m;
int p[n+1];
p[1] = 1;
for (int i = 2; i <= n; i++) {
in>>p[i];
}
Tree tree(n, p);
for (int i = 0; i < m; i++) {
int x, y;
in>>x>>y;
out<<tree.lca(x, y)<<endl;
}
return 0;
}