Pagini recente » Cod sursa (job #530138) | Cod sursa (job #2009057) | cocurs | Cod sursa (job #1566906) | Cod sursa (job #2428948)
#include <iostream>
#include <fstream>
#include <vector>
#define def1 rm[i][j-1]
#define def2 rm[i+pow][j-1]
std::ifstream fin("lca.in");
std::ofstream fout("lca.out");
int n,m;
int fath[100500];
int pos[100500];
int rm[400500][50];
int d[100500];
std::vector<int> son[100500];
std::vector<int> eul;
void euler(int r)
{
eul.push_back(r);
for(std::vector<int>::iterator it = son[r].begin();it!=son[r].end();++it)
{
pos[*it]=eul.size();
d[*it]=d[r]+1;
euler(*it);
eul.push_back(r);
}
}
int logg(int k)
{
if(k!=0)
return 1+logg(k/2);
return -1;
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
int p;
fin>>p;
fath[i]=p;
son[p].push_back(i);
}
euler(1);
int r= eul.size();
for(int i=0;i<r;i++)
rm[i][0]=eul[i];
int pow=1;
for(int j=1;pow<=r;j++,pow=pow*2)
{
for(int i=0;i<r;i++)
{
if(i+pow>=r) rm[i][j]=def1;
else if(d[def1]<d[def2])
rm[i][j]=def1;
else
rm[i][j]=def2;
}
}//*/
for(int i=0;i<m;i++)
{
int a,b;
fin>>a>>b;
a=pos[a];
b=pos[b];
if(b<a)std::swap(a,b);
int kk= b-a+1;
kk= logg(kk);
int poww= 1<<kk;
int first = rm[a][kk];
int second = rm[b-poww+1][kk];
if(d[first]>d[second]) fout<<second<<"\n";
else fout<<first<<"\n";
}
}