Pagini recente » Cod sursa (job #836079) | Cod sursa (job #1151325) | Cod sursa (job #1062002) | Cod sursa (job #3289075) | Cod sursa (job #2877759)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,k;
int e[200005];
int t[200005];
vector<int>v[200005];
int First[200005];
int rmq[20][400005];
int lev[200005];
int lg[200005];
void DFS(int x,int lv)
{
e[++k]=x;
First[x]=k;
lev[k]=lv;
for(auto w:v[x])
{
DFS(w,lv+1);
e[++k]=x;
lev[k]=lv;
}
}
void RMQ()
{
for(int i=2;i<=k;i++)
lg[i]=lg[i/2]+1;
for(int i=1;i<=k;i++)
rmq[0][i]=i;
for(int i=1;i<=lg[k];i++)
for(int j=1;j<=k-(1<<i)+1;j++)
{
rmq[i][j]=rmq[i-1][j];
if(lev[rmq[i][j]]>lev[rmq[i-1][j+(1<<(i-1))]])
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
}
int LCA(int x,int y)
{
int st,dr,diff;
st=First[x];
dr=First[y];
if(st>dr) swap(st,dr);
diff=dr-st+1;
int sol=rmq[lg[diff]][st];
int sh=diff-(1<<lg[diff]);
if(sol>rmq[lg[diff]][st+sh])
sol=rmq[lg[diff]][st+sh];
return e[sol];
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
fin>>t[i];
v[t[i]].push_back(i);
}
DFS(1,0);
RMQ();
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
fout<<LCA(x,y)<<"\n";
}
return 0;
}