Pagini recente » Cod sursa (job #1635757) | Cod sursa (job #2815168) | Cod sursa (job #712133) | Cod sursa (job #1749669) | Cod sursa (job #739863)
Cod sursa(job #739863)
#include <fstream>
#include <vector>
#define dim 200001
using namespace std;
int euler[dim], nivel[dim];
int n, m, lungime=0;
int rmq[20][dim];
vector<int> fii[dim];
void Euler_si_Nivel(int nod)
{
int i;
euler[++lungime]=nod;
nivel[nod] = lungime;
for (i=0; i<(int)fii[nod].size(); 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, ny, i;
nx = nivel[x];
ny = nivel[y];
if (nx>ny) swap(nx, ny);
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;
}