Pagini recente » Cod sursa (job #1370979) | Cod sursa (job #2765193) | Cod sursa (job #1526980) | Cod sursa (job #2492455) | Cod sursa (job #2722755)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#define NMAX 100000
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, k, nivel[NMAX+10], rmq[19][2*NMAX+10], fa[NMAX+10];
vector <int> nod[NMAX+10];
void dfs(int x, int p)
{ k++;
fa[x] = k;
rmq[0][k] = x;
nivel[x] = nivel[p] + 1;
for(auto u : nod[x])
if(u != p)
{ dfs(u, x);
k++;
rmq[0][k] = x;
}
}
int solveRMQ(int x, int y)
{ if(nivel[x] <= nivel[y]) return x;
return y;
}
int main()
{
fin >> n >> m;
for(int i=2; i<=n; i++)
{ int x;
fin >> x;
nod[x].push_back(i);
}
dfs(1, 0);
for(int bit=1; (1<<bit)<=k; bit++)
for(int i=1; i<=k-(1<<bit)+1; i++)
rmq[bit][i] = solveRMQ(rmq[bit-1][i], rmq[bit-1][i+(1<<(bit-1))]);
while(m--)
{ int x, y;
fin >> x >> y;
x = fa[x];
y = fa[y];
if(x > y) swap(x, y);
int len = y - x + 1, bit = (int)log2(len);
fout << solveRMQ(rmq[bit][x], rmq[bit][y-(1<<bit)+1]) << '\n';
}
return 0;
}