Pagini recente » Cod sursa (job #1150994) | Cod sursa (job #501677) | Cod sursa (job #2725953) | Cod sursa (job #1248254) | Cod sursa (job #3145112)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, nod, k, x, y;
vector <int> G[NMAX];
int H[NMAX * 2], First[NMAX], L[NMAX * 2];
int rmq[NMAX * 2][19];
int lg[NMAX * 2];
void dfs(int nod, int lev)
{
H[++ k] = nod;
L[k] = lev;
First[nod] = k;
for(vector <int>::iterator it = G[nod].begin(); it != G[nod].end(); it ++)
{
dfs(*it, lev + 1);
H[++ k] = nod;
L[k] = lev;
}
}
void process2()
{
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(L[ rmq[i][j - 1] ] < L[ 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];
}
int main()
{
f >> n >> m;
for(int i = 2; i <= n; i ++)
{
f >> nod;
G[nod].push_back(i);
}
lg[1] = 0;
for(int i = 2; i <= n * 2; i ++)
lg[i] = lg[i / 2] + 1;
dfs(1, 0);
process2();
for(int i = 1; i <= m; i ++)
{
f >> x >> y;
x = First[x], y = First[y];
if(x > y)
swap(x, y);
int l = lg[y - x + 1];
int val;
if(L[ rmq[x][l] ] < L[ rmq[y - (1 << l) + 1][l] ] )
val = rmq[x][l];
else
val = rmq[y - (1 << l) + 1][l];
g << H[val] << '\n';
}
return 0;
}