Cod sursa(job #1307565)

Utilizator whoasdas dasdas who Data 2 ianuarie 2015 16:06:39
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#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;
}