Pagini recente » Cod sursa (job #3165258) | Cod sursa (job #414227) | Cod sursa (job #326371) | Cod sursa (job #704363) | Cod sursa (job #2818115)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int nmax = 1e5 + 5;
int n, m, k;
int elr[2 * nmax], lev[2 * nmax], first[nmax];
int lg2[2 * nmax], rmq[2 * nmax][18];
vector <int> v[nmax];
void read(){
fin >> n >> m;
for(int i = 2; i <= n; i++){
int tt;
fin >> tt;
v[tt].push_back(i);
}
}
void eulerRep(int node, int lvl){
elr[++k] = node;
lev[k] = lvl;
first[node] = k;
for(int i = 0; i < v[node].size(); i++){
eulerRep(v[node][i], lvl + 1);
elr[++k] = node;
lev[k] = lvl;
}
}
void init_lg2(){
lg2[0] = lg2[1] = 0;
for(int i = 2; i <= k; i++)
lg2[i] = lg2[i/2] + 1;
}
void init_rmq(){
for(int i = 1; i <= k; i++)
rmq[i][0] = i;
for(int j = 1; (1<<j) <= k; j++)
for(int i = 1; i + (1<<(j-1)) <= k; i++)
if(lev[rmq[i][j - 1]] < lev[rmq[i + (1<<(j-1))][j - 1]])
rmq[i][j] = rmq[i][j - 1];
else
rmq[i][j] = rmq[i + (1<<(j-1))][j - 1];
}
void queries(){
while(m--){
int x, y;
fin >> x >> y;
int l = min(first[x], first[y]);
int r = max(first[x], first[y]);
int len = lg2[r - l + 1];
int x1 = rmq[l][len];
int y1 = rmq[r - (1<<len) + 1][len];
if(lev[x1] < lev[y1])
fout << elr[x1] << "\n";
else
fout << elr[y1] << "\n";
}
}
int main()
{
read();
eulerRep(1, 1);
init_lg2();
init_rmq();
queries();
return 0;
}