Pagini recente » Cod sursa (job #1519029) | Cod sursa (job #1815208) | Cod sursa (job #495467) | Borderou de evaluare (job #165087) | Cod sursa (job #1714793)
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
int x[100001],i,j,k,l,n,m,e[200002],nv[100001],N,o,p,O,first[100001];
int A,B;
int D[20][100001];
vector<int> a[100001];
void euler(int i)
{
D[0][k++]=i;if(!first[i])first[i]=k-1;
if(x[i]>0)
{
for(int j10=0;j10<x[i];++j10)
{
euler(a[i][j10]);
D[0][k++]=i;
//cout<<a[i][j]<<" ";
}
}
}
int mn(int a,int b)
{
if(a>b)return b;
return a;
}
int log2(int a)
{
if(a==0)return 0;
if(a==1)return 0;
int k10;
for(k10=0;(1<<k10)<a;++k10);
if((1<<k10)>a)--k10;
return k10;
}
int main()
{
ifstream f("lca.in");
f>>n>>m;nv[1]=0;
for(i=1;i<n;++i)
{
f>>l;nv[i+1]=nv[l]+1;
a[l].push_back(i+1);
++x[l];
}
k=1;
euler(1);
N=log2(k)+1;
for(i=1;i<N;++i)
{
for(j=1;j<k;++j)
{
D[i][j]=mn(D[i-1][j],D[i-1][j+(1<<(i-1))]);
}
}
ofstream g("lca.out");
for(l=0;l<m;++l)
{
f>>o>>p;
A=first[o];B=first[p];
if(A>B)swap(A,B);
o=log2(B-A);//cout<<A<<" "<<B<<" "<<o<<" ";
p=mn(D[o][A],D[o][B-(1<<o)+1]);
//cout<<D[o][B-(1<<o)+1]<<" "<<D[o][A]<<'\n';
g<<p<<'\n';
}
f.close();
g.close();
return 0;
}