Pagini recente » Cod sursa (job #968914) | Cod sursa (job #576421) | Cod sursa (job #342876) | Cod sursa (job #448975) | Cod sursa (job #383598)
Cod sursa(job #383598)
#include <stdio.h>
#include <vector>
#define nmax 100005
#define mmax 200005
#define lmax 20
using namespace std;
int n, m, w, d [nmax], p2 [nmax<<2], poz [nmax], r [lmax] [nmax<<2];
vector <int> fii [nmax];
void init ()
{
p2 [1]=0;
for (int i=2; i <= w; ++i) p2 [i] = p2 [i>>1]+1;
}
void euler (int nod)
{
int i;
r [0] [++w]=nod;
poz [nod]=w;
for (i=0; i < fii [nod].size (); ++i)
{
d [fii [nod] [i]]=d [nod]+1;
euler (fii [nod] [i]);
r [0] [++w]=nod;
}
}
void rmq ()
{
int i, j, i1=p2 [w], i2;
for (i=1; i <= i1; ++i)
{
i2=w-p2 [i]+1;
for (j=1; j <= i2; ++j)
if (d [r [i-1] [j]] < d [r [i-1] [j+(1<<(i-1))]])
r [i] [j]=r [i-1] [j];
else
r [i] [j]=r [i-1] [j+(1<<(i-1))];
}
}
int main ()
{
freopen ("lca.in", "r", stdin);
freopen ("lca.out", "w", stdout);
int i, a, b, k, x, aux, a2, b2;
scanf ("%d%d", &n, &m);
for (i=2; i <= n; ++i)
{
scanf ("%d", &x);
fii [x].push_back (i);
}
euler (1);
init ();
rmq ();
for (i=1; i <= m; ++i)
{
scanf ("%d%d", &a, &b);
a2=poz [a];
b2=poz [b];
if (b2 < a2)
{
aux=a2;
a2=b2;
b2=aux;
}
k=p2 [b2-a2+1];
if (d [r [k] [a2]] < d [r [k] [b2-(1<<k)+1]])
printf ("%d\n", r [k] [a2]);
else
printf ("%d\n", r [k] [b2-(1<<k)+1]);
}
return 0;
}