Pagini recente » Cod sursa (job #977974) | Cod sursa (job #1552492) | Cod sursa (job #1590733) | Cod sursa (job #2739853) | Cod sursa (job #675974)
Cod sursa(job #675974)
#include <fstream>
#include <vector>
using namespace std;
ifstream fi ("lca.in");
ofstream fo ("lca.out");
const int dim = 100005, lgm = 21;
int N, M, NE, S[dim], P2[dim<<1], Ap[dim<<1], Au[dim<<1], E[lgm][dim<<1];
vector <int> V[dim];
void init ()
{
fi >> N >> M;
for (int i = 2, x; i <= N; i++)
{
fi >> x;
V[x].push_back (i);
}
}
void dfs (int n, int k)
{
S[n] = k;
E[0][++NE] = n;
Ap[n] = NE;
for (int i = 0; i < V[n].size(); i++)
{
dfs (V[n][i], k + 1);
E[0][++NE] = n;
}
Au[n] = NE;
}
void prep ()
{
int i, j;
for (i = 1; (1<<i) <= NE; i++)
for (j = 1; j + (1<<i) - 1 <= NE; j++)
if (S[E[i-1][j]] < S[E[i-1][j + (1<<(i-1))]])
E[i][j] = E[i-1][j];
else
E[i][j] = E[i-1][j + (1<<(i-1))];
for (int i = 2; i <= NE; i++)
P2[i] = P2[i>>1] + 1;
}
int query (int x, int y)
{
if (x > y) { int z = x; x = y; y = z; }
int k = P2[y - x + 1];
if (S[E[k][x]] < S[E[k][y+1 - (1<<k)]])
return E[k][x];
else
return E[k][y+1 - (1<<k)];
}
int main ()
{
init ();
dfs (1, 1);
prep ();
int x, y;
while ( M-- )
{
fi >> x >> y;
fo << query (Ap[x], Ap[y]) << '\n';
}
return 0;
}