Pagini recente » Cod sursa (job #990174) | Cod sursa (job #208484) | Cod sursa (job #2677708) | Cod sursa (job #2335324) | Cod sursa (job #714271)
Cod sursa(job #714271)
//Include
#include <fstream>
#include <vector>
using namespace std;
//Constante
const int MAX_SIZE = (int)1e5+1;
//Functii
void dfs(int x);
//Variabile
ifstream in("lca.in");
ofstream out("lca.out");
int n, q;
int nivel[MAX_SIZE], tata[MAX_SIZE];
vector<int> graf[MAX_SIZE];
//Main
int main()
{
in >> n >> q;
for(int i=2 ; i<=n ; ++i)
in >> tata[i], graf[tata[i]].push_back(i);
dfs(1);
int nod1, nod2;
for(int i=1 ; i<=q ; ++i)
{
in >> nod1 >> nod2;
while(nivel[nod1] > nivel[nod2])
nod1 = tata[nod1];
while(nivel[nod2] > nivel[nod1])
nod2 = tata[nod2];
while(nod1 != nod2)
nod1 = tata[nod1], nod2 = tata[nod2];
out << nod1 << '\n';
}
in.close();
out.close();
return 0;
}
void dfs(int x)
{
vector<int>::iterator it, end;
end=graf[x].end();
for(it=graf[x].begin(); it!=end ; ++it)
nivel[*it] = nivel[x] + 1, dfs(*it);
}