Pagini recente » Cod sursa (job #2066268) | Cod sursa (job #2554891) | Cod sursa (job #94475) | Cod sursa (job #569424) | Cod sursa (job #2230154)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int nmax = 100005;
int eul[2*nmax], ne, n, m, tt, x, y, i, j, first[nmax];
int rmq[18][2*nmax], niv[nmax], log2[2*nmax];
vector <int> ls[nmax];
void dfs( int x )
{
int l = ls[x].size(), i, y;
eul[ne++] = x;
first[x] = ne;
for ( i = 0 ; i < l ; i++ )
{
y = ls[x][i];
niv[y] = niv[x]+1;
dfs(y);
eul[ne++] = x;
}
}
void range_minimum()
{
int i, j, x, y;
for ( i = 2 ; i <= ne ; i++ )
log2[i] = log2[i/2]+1;
for ( i = 1 ; i <= ne ; i++ )
rmq[0][i] = eul[i];
for (i=1; (1<<i )<= ne; i++)
for ( j =1 ; j+(1<<i)+1 <= ne ; j++)
{
x = rmq[i-1][j];
y = rmq[i-1][j+(1<<(i-1))];
if(niv[x] < niv[y])
rmq[i][j] = x;
else
rmq[i][j] = y;
}
}
int query(int x, int y)
{
int a = first[x], b = first[y];
if( a > b )
swap(a, b);
int diff = b-a+1;
int i = log2[diff];
int aa = rmq[i][a];
int bb = rmq[i][b-(1<<i)+1];
if( niv[aa] < niv[bb])
return aa;
else
return bb;
}
int main()
{
f >> n >> m;
for ( int i = 2 ; i <= n ; i++ )
{
f >> tt;
ls[tt].push_back(i);
}
dfs(1);
range_minimum();
while ( m-- )
{
f >> x >> y ;
g << query( x , y ) << "\n";
}
return 0;
}