Pagini recente » Cod sursa (job #1359038) | Cod sursa (job #1458022) | Cod sursa (job #562288) | Cod sursa (job #594955) | Cod sursa (job #2375084)
#include <bits/stdc++.h>
#define Dim 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N,M,a,b,E[4*Dim],G[Dim],Prim[Dim];
int cnt,xmin,xmax;
int dp[4*Dim][20],lg[4*Dim];
vector <int> V[Dim];
void DFS(int nod,int niv)
{
E[++cnt]=nod;
G[cnt]=niv;
Prim[nod]=cnt;
for(unsigned int i=0;i<V[nod].size();i++)
{
int vecin=V[nod][i];
DFS(vecin,niv+1);
E[++cnt]=nod;
G[cnt]=niv;
}
}
void RMQ()
{
for (int i = 2 ; i <= cnt ; ++ i ) lg [ i ] = lg [ i >> 1 ] + 1 ;
for(int i=1;i<=cnt;i++) dp[i][0]=i;
for(int j=1;(1<<j)<=cnt;j++)
for(int i=1;i+(1<<j)<=cnt;i++)
if(G[dp[i][j-1]]<G[dp[i+(1<<(j-1))][j-1]])
dp[i][j]=dp[i][j-1];
else
dp[i][j]=dp[i+(1<<(j-1))][j-1];
}
int main()
{
f>>N>>M;
for(int i=2;i<=N;i++)
{
f>>a;
V[a].push_back(i);
}
DFS(1,0);
RMQ();
for(int i=1;i<=M;i++)
{
f>>a>>b;
xmin=Prim[a];
xmax=Prim[b];
if(xmin>xmax) swap(xmin,xmax);
int pr=lg[xmax-xmin+1];
int dif=xmax-xmin+1;
if(G[dp[xmin][pr]]<G[dp[xmin-(1<<pr)+dif][pr]]) g<<E[dp[xmin][pr]]<<'\n';
else g<<E[dp[xmin-(1<<pr)+dif][pr]]<<'\n';
}
return 0;
}