Pagini recente » Cod sursa (job #466230) | Cod sursa (job #1865399) | Cod sursa (job #1942410) | Cod sursa (job #51159) | Cod sursa (job #2134215)
#include <bits/stdc++.h>
using namespace std;
const int MAX = 100005;
int Matrix[20][MAX];
int Euler[MAX << 1];
int Level[MAX << 1];
int AP[MAX << 1];
int lg[MAX << 1];
bitset < MAX << 1 > Busy;
int countt;
int N ,M;
vector < int > myVector[MAX];
inline void Read()
{
scanf("%d%d" , &N , &M);
for ( int i = 2; i <= N ; ++i)
{
int x;
scanf("%d" , &x);
myVector[x].push_back(i);
}
}
void DFS(int nod , int level)
{
Euler[++countt] = nod;
Level[countt] = level;
AP[nod] = countt;
for ( size_t k = 0 ; k < myVector[nod].size() ; ++k)
{
int neighbor = myVector[nod][k];
DFS(neighbor , level+1);
Euler[++countt] = nod;
Level[countt] = level;
}
}
void RMQ()
{
lg[1] = 0;
for ( int i = 2; i <= countt ; ++i)
lg[i] = lg[i/2]+1;
for ( int i = 1 ; i <= countt ; ++i)
{
Matrix[0][i] = i;
}
for ( int i = 1; i <= lg[countt] ; ++i)
for ( int j = 1; j <= countt - (1<<i) ; ++j)
{
int l = 1 << (i-1);
Matrix[i][j] = Matrix[i-1][j];
if(Level[Matrix[i-1][j+l]] < Level[Matrix[i][j]])
Matrix[i][j] = Matrix[i-1][j+l];
}
}
inline int LCA ( int a , int b)
{
a = AP[a];
b = AP[b];
if(a>b) swap(a,b);
int dif = b-a+1;
int k = lg[dif];
int solutie = Matrix[k][a];
int q = dif - (1 << k);
if( Level[solutie] > Level[Matrix[k][a+q]]);
solutie = Matrix[k][a+q];
return Euler[solutie];
}
int main()
{
freopen("lca.in" , "r" ,stdin);
freopen("lca.out" ,"w" , stdout);
Read();
DFS(1,0);
RMQ();
for( int i = 1; i <= M ; ++i)
{
int x,y;
scanf("%d%d" , &x ,&y);
printf("%d\n" , LCA(x,y));
}
}