Pagini recente » Cod sursa (job #2299650) | Cod sursa (job #504442) | Cod sursa (job #855639) | Clasament prima.rudana | Cod sursa (job #2570803)
#include <fstream>
#include <vector>
#define MAX 100005
std :: ifstream fin ("lca.in");
std :: ofstream fout("lca.out");
int n, m;
std :: vector<int> parentArray;
int levels[MAX];
// int LCA(int node, int node1, int node2) {
// int commonAncestor = 0;
// if (node == node1)
// return node1;
// if (node == node2)
// return node2;
// for (int i = 1;i <= n;i ++) {
// if (parentArray[i] == node) {
// commonAncestor += LCA(i, node1, node2);
// if (commonAncestor == node1 + node2) {
// commonAncestor = node;
// break;
// }
// }
// }
// return commonAncestor;
// }
void DFS(int node, int level) {
levels[node] = level;
for (int i = 1;i <= n;i ++) {
if (parentArray[i] == node) {
DFS(i, level + 1);
}
}
}
int main() {
fin >> n >> m;
parentArray.resize(n + 1);
parentArray[1] = -1;
for (int i = 2;i <= n;i ++) {
fin >> parentArray[i];
}
DFS(1, 0);
int x, y;
for (int i = 1;i <= m;i ++) {
fin >> x >> y;
while (x != y) {
if (levels[x] > levels[y])
x = parentArray[x];
else
y = parentArray[y];
}
fout << x << std :: endl;
}
fin.close();
fout.close();
return 0;
}