Pagini recente » Cod sursa (job #2703152) | Cod sursa (job #341595) | Cod sursa (job #1697449) | Cod sursa (job #950875) | Cod sursa (job #2639815)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,v[100005],m,x,y,first[100005],nr;
int rmq[20][200005],lg[200005];
vector<int>vecini[100005];
vector<int>euler,nivel;
void prec(){
lg[1]=0;
for(int i=2 ; i<2*n ; i++) lg[i] = lg[i/2] + 1;
for(int i=1 ; i<2*n ; i++) rmq[0][i] = euler[i];
for(int j=1 ; j<=lg[2*n-1] ; j++)
for(int i=1 ; i<=2*n-(1<<j) ; i++) rmq[j][i] = min(rmq[j-1][i],rmq[j-1][i+(1<<(j-1))]);
}
void dfs(int nod,int height){
euler.push_back(nod);
nivel.push_back(height);
nr++;
if(!first[nod]) first[nod]=nr;
for(int i=0 ; i<vecini[nod].size() ; i++){
x=vecini[nod][i];
dfs(x,height+1);
euler.push_back(nod);
nivel.push_back(height);
nr++;
}
}
int main()
{
f>>n>>m;
euler.push_back(10000000);
nivel.push_back(10000000);
for(int i=1;i<n;i++){
f>>v[i];
vecini[v[i]].push_back(i+1);
}
dfs(1,0);
prec();
for(int i=1;i<=m;i++){
f>>x>>y;
x=first[x];
y=first[y];
if(x>y) swap(x,y);
int lung=y-x+1;
int ff=lg[lung];
g<<min( rmq[ff][x],rmq[ff][y+1-(1<<ff)] )<<'\n';
}
}