Pagini recente » Rating Dinu Rosca (dinurosca1503) | Cod sursa (job #1266060) | Cod sursa (job #2661235) | Cod sursa (job #1300651) | Cod sursa (job #2676101)
#include <iostream>
#include <fstream>
#include <vector>
#define _MAX_N 100005
using namespace std;
fstream in("lca.in", ios::in);
ofstream out("lca.out", ios::out);
vector<int> T[_MAX_N];
vector<int> Tati;
bool vizitat[_MAX_N];
int N, M;
void Read(int &queries)
{
int x;
Tati.push_back(0);
Tati.push_back(-1);
in >> N >> queries;
for(int k = 1; k < N; k++) {
in >> x;
Tati.push_back(x);
}
}
int LCA(int x, int y, int nod = 1)
{
int result = 0;
if(nod == x || nod == y)
return nod;
for(int vecin : T[nod]) {
int search_result = LCA(x, y, vecin); /// 0 - not found; x/y - a found node; node - lowest common ancestor
if(search_result != 0) {
if(result != 0)
return nod;
result = search_result;
}
}
return result;
}
void print_mat(ostream &output_stream, vector<int> M[])
{
for(int i = 1; i <= N; i++) {
for(int Nod : M[i])
output_stream << Nod << ' ';
output_stream << '\n';
}
}
int main()
{
int i, j, queries, x, y;
string output_string;
Read(queries);
for(int nod = 2; nod <= N; nod++)
T[Tati[nod]].push_back(nod);
for(int q = 1; q <= queries; q++) {
in >> x >> y;
output_string += to_string(LCA(x, y));
output_string += "\n";
}
out << output_string;
in.close();
out.close();
return 0;
}