Pagini recente » Cod sursa (job #2530953) | Cod sursa (job #1105077) | Cod sursa (job #578108) | Cod sursa (job #2910310) | Cod sursa (job #2721511)
#include <fstream>
#include <vector>
#define f in
#define g out
using namespace std;
ifstream in ( "lca.in" );
ofstream out( "lca.out" );
vector<int> L[100100];
int n, m, i, j, k, x, y, px, py, val;
int v[200200], poz[100100], niv[100100], p[200200];
pair<int, int> d[100100][20], sol;
void dfs ( int nod ){
v[++k] = nod;
poz[nod] = k;
for ( auto vecin : L[nod] ){
niv[vecin] = 1+niv[nod];
dfs(vecin);
v[++k] = nod;
}
}
int main() {
f>>n>>m;
for ( i=2; i <= n; i++ ){
f>>x;
L[x].push_back(i);
}
niv[1] = 1;
dfs(1);
for ( i=2; i <= k; i++ )
p[i] = p[i/2]+1;
for ( i=1; i <= k; i++ )
d[i][0] = {niv[v[i]],i};
for ( j=1; (1<<j) <= k; j++ )
for ( i=1; i <= k; i++ ) {
d[i][j] = d[i][j-1];
val = i+(1<<(j-1));
if ( val <= k && d[val][j-1].first < d[i][j].first )
d[i][j] = d[val][j-1];
}
for ( ; m--; ){
f>>x>>y;
px = poz[x];
py = poz[y];
if ( px > py )
swap(px, py);
val = p[py-px+1];
sol = min ( d[px][val], d[py-(1<<val)+1][val] );
g<<v[sol.second]<<"\n";
}
return 0;
}