Pagini recente » Cod sursa (job #3304253) | Cod sursa (job #3355677) | Cod sursa (job #1269003) | Monitorul de evaluare | Cod sursa (job #3349174)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<vector<int> > v;
const int log = 17;
int anc[20][100001], niv[100001];
void dfs(int nod, int tata)
{
//cout << nod;
anc[0][nod] = tata;
for(int i = 1; i<=log; i++)
{
anc[i][nod] = anc[i-1][anc[i-1][nod]];
}
for(int i = 0; i<v[nod].size(); i++)
{
if(tata != v[nod][i])
{
niv[v[nod][i]] = niv[nod] + 1;
dfs(v[nod][i],nod);
}
}
}
int lca(int nod1, int nod2)
{
if(niv[nod1] < niv[nod2]) swap(nod1, nod2);
for(int i = log; i >= 0; i--)
{
if(niv[nod1] - (1 << i) >= niv[nod2])
nod1 = anc[i][nod1];
}
if(nod1 == nod2) return nod1;
for(int i = log; i >= 0; i--)
{
if(anc[i][nod1] != anc[i][nod2])
{
nod1 = anc[i][nod1];
nod2 = anc[i][nod2];
}
}
return anc[0][nod1];
}
int main()
{
int n, m;
fin >> n >> m;
v.resize(n+1);
for(int i = 2; i<=n; i++)
{
int x;
fin >> x;
v[x].push_back(i);
}
niv[1] = 1;
dfs(1,0);
for(int i = 1; i<=m; i++)
{
int a, b;
fin >> a >> b;
fout << lca(a,b) << '\n';
}
return 0;
}