Pagini recente » Cod sursa (job #1955670) | Cod sursa (job #2414621) | Cod sursa (job #96513) | Cod sursa (job #612262) | Cod sursa (job #1786263)
#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 index = 0, lca = N + 1;
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 {
lca = min(lca, euler_rep[i]);
break;
}
}
if (left)
lca = min(lca, euler_rep[i]);
}
return lca;
}
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;
}