Pagini recente » Cod sursa (job #2536096) | Cod sursa (job #1576391) | Cod sursa (job #3258005) | Cod sursa (job #2506565) | Cod sursa (job #2657647)
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int G[100005],t,l,r,i,n,x,y,rmq[20][400005],first[100005];
int f[100005],list[400005],nivel[100005],puteri[20],lg[400005],nr;
vector<int> m[10005];
void dfs(int nod)
{
int ind;
f[nod]=1;
list[++nr]=nod;
first[nod]=nr;
for(ind=0;ind<m[nod].size();ind++)
if(f[m[nod][ind]]==0)
{
nivel[m[nod][ind]]=nivel[nod]+1;
dfs(m[nod][ind]);
list[++nr]=nod;
}
}
int main()
{
fin>>n>>t;
puteri[0]=1;
for(i=1;i<=19;i++)
puteri[i]=puteri[i-1]*2;
lg[1]=0;
for(i=2;i<=2*n;i++)
lg[i]=lg[i/2]+1;
//fout<<lg[19]<<"\n";
for(i=2;i<=n;i++)
{
fin>>x;
G[i]=x;
m[x].push_back(i);
}
dfs(1);
for(i=1;i<=nr;i++)
rmq[0][i]=list[i];
for(i=1;i<=19;i++)
{
for(int j=1;j<=nr;j++)
{
x=rmq[i-1][j];
y=rmq[i-1][j+puteri[i-1]];
if(nivel[x]<=nivel[y])
rmq[i][j]=x;
else
rmq[i][j]=y;
}
}
//for(i=1;i<=n;i++)
// fout<<first[i]<<" ";
while(t--)
{
fin>>l>>r;
l=first[l];
r=first[r];
if(l>=r)
swap(l,r);
x=r-l+1;
y=lg[x];
int aux1=rmq[y][l];
int aux2=rmq[y][r-puteri[y]+1];
//fout<<l<<" "<<r<<" "<<x<<" "<<y<<" "<<aux1<<" "<<aux2<<" ";
if(nivel[aux1]<=nivel[aux2])
fout<<aux1<<"\n";
else
fout<<aux2<<"\n";
}
return 0;
}