Pagini recente » Cod sursa (job #2227851) | Cod sursa (job #1480951) | Cod sursa (job #158139) | Cod sursa (job #621152) | Cod sursa (job #1751956)
#include<iostream>
#include<fstream>
#include<vector>
#define DX 100100
using namespace std;
fstream fin("lca.in",ios::in),fout("lca.out",ios::out);
typedef vector<int> VI;
VI v[DX],st;
int n,N,m,ates[DX],log[2*DX],bst[2*DX][20];
void citire();
void dfs(int nod,int tata);
void rmq();
int lca(int x,int y);
int main()
{
int i,x,y;
citire();
dfs(1,0);
rmq();
for(i=2;i<=N;i++) log[i]=log[i/2]+1;
for(i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
}
int lca(int x,int y)
{
int a=ates[x],b=ates[y],dist,lg;
if(a>b) swap(a,b);
dist=b-a+1;
lg=log[dist];
//cout<<a<<" "<<b<<" "<<dist<<" "<<lg<<" "<<"bst1: "<<bst[a][lg]<<" intre "<<a<<";"<<lg<<" bst2:"<<bst[b-lg+1][lg]<<"intre: "<<b-lg+1<<";"<<lg<<"\n";
return min(bst[a][lg],bst[b-(1<<lg)+1][lg]);
}
void rmq()
{
int i,j;
for(j=0;(1<<j)<=N;j++)
{
for(i=0;i+(1<<j)<=N;i++)
{
if(j==0)
bst[i][j]=st[i];
else
bst[i][j]=min(bst[i][j-1],bst[i+(1<<(j-1))][j-1]);
}
}
}
void dfs(int nod,int tata)
{
int i,f;
ates[nod]=st.size();
st.push_back(nod);
for(i=0;i<v[nod].size();i++)
{
f=v[nod][i];
if(f!=tata)
{
dfs(f,nod);
st.push_back(nod);
}
}
}
void citire()
{
fin>>n>>m;
N=2*n-1;
int x,i;
for(i=1;i<n;i++)
{
fin>>x;
v[x].push_back(i+1);
}
}