Pagini recente » Cod sursa (job #545732) | Romanii medaliati la IOI | Cod sursa (job #2714754) | Cod sursa (job #1889919) | Cod sursa (job #2867306)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, Tata[100001];
queue <int> Solutie;
int echivalareGrad(int nod, int contorA, int contorB)
{
while(contorA != contorB)
{
nod = Tata[nod];
contorA--;
}
return nod;
}
int verificareGrad(int grad)
{
int contor = 0;
while(Tata[grad] != 0)
{
grad = Tata[grad];
contor++;
}
return contor;
}
int LCA(int a, int b)
{
int gradA = verificareGrad(a);
int gradB = verificareGrad(b);
if(gradA > gradB)
a = echivalareGrad(a, gradA, gradB);
else if(gradB > gradA)
b = echivalareGrad(b, gradB, gradA);
if(a == b) return a;
else while(Tata[a] != Tata[b])
{
a = Tata[a];
b = Tata[b];
}
return Tata[a];
}
void Citire()
{
fin >> n >> m;
for(int i = 2; i <= n; i++)
fin >> Tata[i];
Tata[1] = 0;
}
void Tiparire()
{
while(!Solutie.empty())
{
fout << Solutie.front() << endl;
Solutie.pop();
}
}
int main()
{
Citire();
int a, b;
for(int i = 1; i <= m; i++)
{
fin >> a >> b;
Solutie.push(LCA(a, b));
}
Tiparire();
return 0;
}