Pagini recente » Cod sursa (job #2694506) | Cod sursa (job #2692970) | Cod sursa (job #1850522) | Cod sursa (job #2884537) | Cod sursa (job #897361)
Cod sursa(job #897361)
#include<stdio.h>
#include<vector>
#define maxn 100005
#define maxlog 19
#define pb push_back
using namespace std;
FILE*f=fopen("lca.in","r");
FILE*g=fopen("lca.out","w");
int n,q,p;
int rmq[maxlog][maxn<<1],Eul[maxn<<1],Fap[maxn],Niv[maxn<<1],E[maxn<<1];
vector<int>G[maxn];
inline void citire () {
fscanf(f,"%d %d",&n,&q);
int t;
for ( int i = 2 ; i <= n ; ++i ){
fscanf(f,"%d",&t);
G[t].pb(i);
}
}
void dfs ( int nod , int niv ){
Eul[++p] = nod; Niv[p] = niv;
Fap[nod] = p;
for ( vector<int>::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
int nodvcn = (*itt);
dfs(nodvcn,niv+1);
Eul[++p] = nod; Niv[p] = niv;
}
}
inline void Rmq () {
int i,k;
for ( i = 2 ; i <= p ; ++i ){
E[i] = E[i>>1] + 1;
}
for ( i = 1 ; i <= p ; ++i ){
rmq[0][i] = i;
}
for ( k = 1 ; k <= E[p] ; ++k ){
for ( i = 1 ; i + (1<<k) - 1 <= p ; ++i ){
rmq[k][i] = Niv[rmq[k-1][i]] <= Niv[rmq[k-1][i+(1<<(k-1))]] ? rmq[k-1][i] : rmq[k-1][i+(1<<(k-1))];
}
}
}
inline void swap ( int &a , int &b ){
int aux = a ; a = b ; b = aux;
}
inline int lca ( int nod1 , int nod2 ){
if ( Fap[nod1] > Fap[nod2] ){
swap(nod1,nod2);
}
int x = Fap[nod1]; int y = Fap[nod2];
int e = E[y-x+1];
int poz_lca = Niv[rmq[e][x]] <= Niv[rmq[e][y-(1<<e)+1]] ? rmq[e][x] : rmq[e][y-(1<<e)+1];
return Eul[poz_lca];
}
inline void solve () {
for ( int i = 1 ; i <= q ; ++i ){
int x,y;
fscanf(f,"%d %d",&x,&y);
fprintf(g,"%d\n",lca(x,y));
}
}
int main () {
citire();
dfs(1,1);
Rmq();
solve();
fclose(f);
fclose(g);
return 0;
}