Pagini recente » Cod sursa (job #2376568) | Cod sursa (job #2775790) | Cod sursa (job #2217327) | Cod sursa (job #2354804) | Cod sursa (job #2153103)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int nmax=2e5+3;
int L[nmax];
vector<int> v;
int first[nmax];
int lg[nmax],D[40][nmax];
vector<int> graf[nmax];
int n,m;
void euler(int node,int level)
{
L[v.size()]=level;
first[node]=v.size();
v.push_back(node);
for(int i=0; i<graf[node].size(); i++)
{
euler(graf[node][i],level+1);
L[v.size()]=level;
v.push_back(node);
}
}
void process()
{
lg[1]=0;
for(int i=2; i<=v.size(); i++)
lg[i]=lg[i/2]+1;
for(int i=1; i<=v.size(); i++)
D[0][i]=i;
for(int i=1;(1<<i)<v.size();i++)
for(int j=1; j<=v.size()-(1<<i); j++)
{
int l=(1<<(i-1));
D[i][j]=D[i-1][j];
if(L[D[i-1][j+l]]<L[D[i][j]]) D[i][j]=D[i-1][j+l];
}
for(int i=1; i<=m; i++)
{
int x,y,a,b;
f>>a>>b;
x=first[a];y=first[b];
if(x>y) swap(x,y);
int diff=y-x+1;
int l=lg[diff];
int sol=D[l][x];
int sh=diff-(1<<l);
if(L[sol]>L[D[l][x+sh]])
sol=D[l][x+sh];
g<<v[sol]<<"\n";
}
}
int main()
{
f>>n>>m;
for(int i=1; i<n; i++)
{
int aux;
f>>aux;
graf[aux].push_back(i+1);
}
euler(1,0);
process();
return 0;
}