Pagini recente » Cod sursa (job #3130869) | Cod sursa (job #888545) | Profil Victoria | Istoria paginii utilizator/florinchi3 | Cod sursa (job #767557)
Cod sursa(job #767557)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
vector<int> e,u(2,0),h(2,0),f(2,0);
vector< vector<int> > t(2);
int min(int a, int b){
if(a>100000) return(b);
if(b>100000) return(a);
if(h[a]>h[b]){ return(b); }
else { return(a); }
}
void dfs(int v);
int main(){
int n,m,q;
ifstream cinr ("lca.in");
ofstream cour ("lca.out");
cinr >> n; cinr >> m;
for(int i=2; i<=n; i++){
t.push_back(e);
u.push_back(0);
h.push_back(0);
f.push_back(0);
cinr >> q;
t[q].push_back(i);
}
dfs(1);
int k=1<<int(log(e.size()-1)/log(2)+1);
vector<int> w(2*k, 200000);
for(int i=0; i<e.size(); i++) w[k+i]=e[i];
for(int i=k-1; i>0; i--) w[i]=min(w[2*i], w[2*i+1]);
int l,r;
for(int i=1; i<=m; i++){
cinr >> l; cinr >> r;
l=f[l]+k-1;
r=f[r]+k-1;
if(l>r){
int y=l;
l=r; r=y;
}
int mn=300000;
while(l<=r){
if(l%2==1) mn=min(mn, w[l]);
if(r%2==0) mn=min(mn, w[r]);
l=(l+1)/2; r=(r-1)/2;
}
cour << mn << "\n";
}
cinr.close();
cour.close();
//cin.ignore(2);
return 0;
}
void dfs(int v){
e.push_back(v);
f[v]=e.size();
u[v]=1;
for(int i=0; i<t[v].size(); i++){
if(u[t[v][i]]==0){
h[t[v][i]]=h[v]+1;
dfs(t[v][i]);
}
e.push_back(v);
}
}