Pagini recente » Cod sursa (job #2047785) | Cod sursa (job #717615) | Cod sursa (job #1123108) | Cod sursa (job #2178657) | Cod sursa (job #2229867)
#include <fstream>
#include <vector>
#define VAL 200005
#define PUT 25
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int N, M, i, j, nod, E[VAL], L[VAL];
int RMQ[VAL][PUT], K, A, B, P, be, en;
int First[VAL], Last[VAL], LOG[VAL], X, Y;
vector <int> G[VAL];
void DFS(int nod, int niv)
{
vector <int> :: iterator it;
E[++K]=nod;
L[K]=niv;
RMQ[K][0]=K;
if (First[nod]==0)
First[nod]=K;
Last[nod]=K;
for (it=G[nod].begin(); it!=G[nod].end(); it++)
{
DFS(*it, niv+1);
E[++K]=nod;
L[K]=niv;
RMQ[K][0]=K;
Last[nod]=K;
}
}
int main()
{
fin >> N >> M;
for (i=2; i<=N; i++)
{
fin >> X;
G[X].push_back(i);
}
DFS(1, 1);
E[0]=L[0]=VAL;
for (i=1; i<=K; i++)
{
LOG[i]=P;
if (i==2*(1 << P))
P++;
}
for (j=1; j<=P; j++)
{
for (i=1; i+(1 << j)-1<=K; i++)
{
A=RMQ[i][j-1];
B=RMQ[i+(1 << (j-1))][j-1];
if (L[A]<L[B])
RMQ[i][j]=A;
else
RMQ[i][j]=B;
}
}
for (i=1; i<=M; i++)
{
fin >> X >> Y;
if (First[X]>Last[Y])
swap(X, Y);
be=First[X];
en=Last[Y];
A=LOG[en-be+1];
B=(1 << A);
X=RMQ[be][A];
Y=RMQ[en-B+1][A];
if (L[X]<L[Y])
fout << E[X] << '\n';
else
fout << E[Y] << '\n';
}
fin.close();
fout.close();
return 0;
}