Pagini recente » Cod sursa (job #587017) | Cod sursa (job #513977) | Cod sursa (job #834978) | Cod sursa (job #2596410) | Cod sursa (job #2134194)
#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-1)) ; ++j)
{
Matrix[i][j] = Matrix[i-1][j];
if(Level[Matrix[i-1][j+(1<<(i-1))]] < Level[Matrix[i-1][j]])
Matrix[i][j] = Matrix[i-1][j+(1<<(i-1))];
}
for ( int i = 0; i <= lg[countt] ; ++i)
{for ( int j = 1 ; j <= countt ; ++j)
cout << Matrix[i][j] <<" ";
cout <<endl;}
for (int i = 1; i <= countt ; ++i)
cout << Euler[i] <<" ";
cout << endl;
}
inline int LCA ( int a , int b)
{
a = AP[a];
b = AP[b];
if(a>b) swap(a,b);
int k = lg[b-a+1];
int solutie = Matrix[k][a];
if( Level[Matrix[k][b-(1<<k)+1]]< Level[Matrix[k][a]]);
solutie = Matrix[k][b-(1<<k)+1];
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));
}
}