Pagini recente » Cod sursa (job #360737) | Cod sursa (job #2666307) | Cod sursa (job #135733) | Cod sursa (job #88673) | Cod sursa (job #2467136)
#include <fstream>
#include <vector>
#include <math.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
void dfs ( int nod );
struct A
{
int val, poz;
};
vector < int > fii[100001];
vector < A > rmq[18];
int n, m, j, k, x, Lg, b, c;
int t, a[200001], lvl[200001], prim[100001];
int main()
{
int i;
fin >> n >> m;
for ( i = 2 ; i <= n ; i++ )
{
fin >> t;
fii[t].push_back ( i );
}
dfs ( 1 );
Lg = j;
x = log2 ( Lg );
for ( i = 1 ; i <= Lg ; i++ ) rmq[0].push_back ( { lvl[i], a[i] } );
for ( i = 1 ; i <= x ; i++ )
for ( j = 0 ; j < Lg - ( 1 << i ) + 1 ; j++ )
{
if ( rmq[i-1][j].val <= rmq[i-1][j+(1<<(i-1))].val ) rmq[i].push_back ( { rmq[i-1][j].val, rmq[i-1][j].poz } );
else rmq[i].push_back ( { rmq[i-1][j+(1<<(i-1))].val, rmq[i-1][j+(1<<(i-1))].poz } );
}
for ( i = 1 ; i <= m ; i++ )
{
fin >> b >> c;
if ( b == c ) fout << b << '\n';
else
{
if ( prim[b] > prim[c] ) swap ( b, c );
x = log2 ( prim[c] - prim[b] + 1 );
if ( rmq[x][prim[b]-1].val <= rmq[x][prim[c]-(1<<x)].val ) fout << rmq[x][prim[b]-1].poz << '\n';
else fout << rmq[x][prim[c]-(1<<x)].poz << '\n';
}
}
return 0;
}
void dfs ( int nod )
{
int i;
for ( i = 0 ; i < fii[nod].size() ; i++ )
{
a[++j] = nod;
lvl[j] = k;
if ( prim[nod] == 0 ) prim[nod] = j;
k++;
dfs ( fii[nod][i] );
k--;
}
a[++j] = nod;
lvl[j] = k;
if ( prim[nod] == 0 ) prim[nod] = j;
}