Pagini recente » Cod sursa (job #2953173) | Cod sursa (job #3174756) | Cod sursa (job #1231361) | Cod sursa (job #923148) | Cod sursa (job #1786266)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int const MAX_N = 100001;
int const MAX_M = 2000001;
int const ROOT = 1; //radacina
int N, M; //numarul de noduri, numarul de queries
vector<int> graph[MAX_N]; //reprezentarea grafului prin liste
vector<int> euler_rep; //reprezentarea euler cu noduri
vector<int> depth_rep; //reprezentare euler cu adancimi
void DFS(int node, int depth) {
euler_rep.push_back(node);
depth_rep.push_back(depth);
for (size_t i = 0; i < graph[node].size(); i++) {
DFS(graph[node][i], depth + 1);
euler_rep.push_back(node);
depth_rep.push_back(depth);
}
}
int query(int x, int y) {
int min_lvl = N + 1, index;
bool left = false; //variabila care imi semnaleaza inceputul secventei
for (size_t i = 0; i < euler_rep.size(); i++) {
if (euler_rep[i] == x || euler_rep[i] == y) {
if (!left) left = true;
else {
if (min_lvl > depth_rep[i]) {
min_lvl = depth_rep[i];
index = i;
}
break;
}
}
if (left) {
if (min_lvl > depth_rep[i]) {
min_lvl = depth_rep[i];
index = i;
}
}
}
//return index;
return euler_rep[index];
}
int main() {
ifstream fin("lca.in");
ofstream fout("lca.out");
fin >> N >> M;
for (int i = 2; i <= N; i++) {
int father;
fin >> father;
graph[father].push_back(i);
}
DFS(ROOT, 0);
for (int i = 0; i < M; i++) {
int x, y;
fin >> x >> y;
cout << query(x, y) << '\n';
}
fin.close();
fout.close();
return 0;
}