Pagini recente » Cod sursa (job #1197892) | Cod sursa (job #2608224) | Cod sursa (job #1337022) | Cod sursa (job #2460625) | Cod sursa (job #2795765)
#include <bits/stdc++.h>
#define nmax 100005*4
using namespace std;
string prob="lca";
ifstream in(prob+".in");
ofstream out(prob+".out");
int lg[nmax];
int n,m;
int s=1;
int f[nmax];
struct nod{
vector<nod*> v;
int ind;
} noduri[nmax];
struct node{
int d,i;
node(int depth=0,int index=0){
d=depth;
i=index;
}
bool operator <(node other){
return d<other.d;
}
} rmq[32][nmax];
node minn(node one,node two){
if(one<two)return one;
return two;
}
void dolg(){
for(int i=2;i<nmax;i++)lg[i]=lg[i>>1]+1;
}
void input(){
in>>n>>m;
noduri[1].ind=1;
for(int i=2;i<=n;i++){
int nr;
in>>nr;
noduri[i].ind=i;
noduri[nr].v.push_back(&noduri[i]);
}
}
void dfs(nod *k,int depth){
f[k->ind]=s;
rmq[0][s++]=node(depth,k->ind);
for(auto i:k->v){
dfs(i,depth+1);
f[k->ind]=s;
rmq[0][s++]=node(depth,k->ind);
}
}
void dormq(){
for(int i=1;(1<<i)<=s;i++){
for(int j=1;j+(1<<i)<=s;j++){
rmq[i][j]=minn(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
}
}
void doqueries(){
int a,b;
for(int i=0;i<m;i++){
in>>a>>b;
a=f[a];
b=f[b];
if(a>b)swap(a,b);
int ss=b-a+1;
node minnn=minn(rmq[lg[ss]][a],rmq[lg[ss]][b-(1<<lg[ss])+1]);
out<<minnn.i<<'\n';
}
}
int main(){
dolg();
input();
dfs(&noduri[1],0);
dormq();
doqueries();
}