Pagini recente » Cod sursa (job #2836277) | Cod sursa (job #2874214) | Cod sursa (job #2186674) | Cod sursa (job #1517731) | Cod sursa (job #2581680)
#include <fstream>
#include <vector>
#define Nmax 100010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,pap[Nmax],nr;
pair<int,int> dp[20][2*Nmax];
bool ap[Nmax];
vector <int> G[Nmax];
void DFS(int start,int adan)
{
dp[0][++nr].first=start;
dp[0][nr].second=adan;
if (ap[start]==0)
ap[start]=1,pap[start]=nr;
for (auto i:G[start])
{
DFS(i,adan+1);
dp[0][++nr].first=start;
dp[0][nr].second=adan;
}
}
void RMQ()
{
int x=0,o=2*n,i,j;
while ((1<<x)<=o)
x++;
for (i=1;i<x;i++)
for (j=1;j<=o-(1<<i)+1;j++)
{
dp[i][j]=dp[i-1][j];
if (dp[i][j].second>dp[i-1][j+(1<<(i-1))].second)
dp[i][j]=dp[i-1][j+(1<<(i-1))];
}
}
int main()
{
int i,a,b;
fin>>n>>m;
for (i=1;i<n;i++)
{
fin>>a;
G[a].push_back(i+1);
}
DFS(1,0);
RMQ();
for (i=1;i<=m;i++)
{
fin>>a>>b;
int a1=min(pap[a],pap[b]),b1=max(pap[a],pap[b]);
int l=b1-a1+1,x=0;
while ((1<<x)<=l)
x++;
x--;
pair<int,int> max1;
max1=dp[x][a1];
if (max1.second>dp[x][b1-(1<<x)+1].second)
max1=dp[x][b1-(1<<x)+1];
fout<<max1.first<<"\n";
}
return 0;
}