Pagini recente » Cod sursa (job #1729907) | Cod sursa (job #2906) | Cod sursa (job #1862025) | Cod sursa (job #584235) | Cod sursa (job #2372318)
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int VAL=400005;
const int CNT=22;
int N, Q, i, j, nod, PUT[VAL], A, B, cnt;
int E[VAL], K, RMQ[VAL][CNT], be, en;
int F[VAL], L[VAL], niv[VAL], X, Y, P;
vector <int> G[VAL];
void DFS(int nod)
{
vector <int> :: iterator it;
E[++K]=nod;
F[nod]=L[nod]=K;
for (it=G[nod].begin(); it!=G[nod].end(); it++)
{
niv[*it]=niv[nod]+1;
DFS(*it);
E[++K]=nod;
L[nod]=K;
}
}
int main()
{
fin >> N >> Q;
for (i=2; i<=N; i++)
{
fin >> nod;
G[nod].push_back(i);
}
niv[1]=1;
DFS(1);
for (i=1; i<=K; i++)
{
PUT[i]=PUT[i-1];
if (i==(1 << (PUT[i]+1)))
PUT[i]++;
}
for (cnt=0; cnt<=PUT[K]; cnt++)
{
for (i=1; i<=K; i++)
{
if (cnt==0)
{
RMQ[i][cnt]=E[i];
continue;
}
j=i+(1 << cnt)-1;
A=RMQ[i][cnt-1];
B=RMQ[(i+j+2) / 2][cnt-1];
if (niv[A]<niv[B])
RMQ[i][cnt]=A;
else
RMQ[i][cnt]=B;
}
}
while (Q>0)
{
Q--;
fin >> X >> Y;
i=min(F[X], F[Y]);
j=max(L[X], L[Y]);
cnt=PUT[j-i+1];
P=1 << cnt;
A=RMQ[i][cnt];
B=RMQ[j-P+1][cnt];
if (niv[A]<niv[B])
fout << A << '\n';
else
fout << B << '\n';
}
fin.close();
fout.close();
return 0;
}