Pagini recente » Rating Dan Seracu (dan.seracu) | Cod sursa (job #2018942) | Cod sursa (job #1184076) | Cod sursa (job #1282431) | Cod sursa (job #739853)
Cod sursa(job #739853)
#include <fstream>
#include <vector>
using namespace std;
#define dim 20000001
int euler[dim],nivel[dim];
int n,m,lungime=0;
int rmq[20][dim];
vector <int> fii[dim];
void Euler_si_Nivel(int nod)
{
euler[++lungime]=nod;
nivel[nod]=lungime;
int numarFii=fii[nod].size();
for(int i=0;i<numarFii;++i)
{
Euler_si_Nivel(fii[nod][i]);
euler[++lungime]=nod;
}
}
void RMQ()
{
for(int i=1;i<lungime;++i)
rmq[0][i]=euler[i];
for(int i=1;(1<<i)<=lungime;++i)
for(int j=1;j<=lungime-(1<<i)+1;++j)
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
int lca(int x,int y)
{
int nx=nivel[x];
int ny=nivel[y];
if (nx>ny) swap(nx,ny);
int i;
for(i=1;(1<<i)<=(ny-nx+1);++i)
--i;
return min(rmq[i][nx],rmq[i][ny-(1<<i)+1]);
}
int main()
{
ifstream fin("lca.in");
ofstream fout("lca.out");
fin>>n;
fin>>m;
int x,y;
for(int i=2;i<=n;++i)
{
fin>>x;
fii[x].push_back(i);
}
Euler_si_Nivel(1);
RMQ();
for(int i=1;i<=m;++i)
{
fin>>x;
fin>>y;
fout<<lca(x,y)<<"\n";
}
fin.close();
fout.close();
return 0;
}