Pagini recente » Cod sursa (job #3256002) | Cod sursa (job #2733354) | Cod sursa (job #1059658) | Cod sursa (job #3150547) | Cod sursa (job #941442)
Cod sursa(job #941442)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M, cnt = -1;
vector <int> muchii[100011];
int indice[100011];
int ST[200011][19];
int Rep_Euler[200011];
void DFS (int nod, int depth)
{
Rep_Euler[++cnt] = nod;
indice[nod] = cnt;
for (int i = 0; i < muchii[nod].size (); i++)
{
DFS (muchii[nod][i], depth + 1);
Rep_Euler[++cnt] = nod;
}
}
void Precalc_ST ()
{
for (int i = 0; i <= cnt; i++)
ST[i][0] = i;
for (int j = 1; (1 << j) <= cnt + 1; j++)
for (int i = 0; i + (1 << j) - 1 <= cnt; i++)
if (Rep_Euler[ST[i][j - 1]] < Rep_Euler[ST[i + (1 << (j - 1))][j - 1]]) ST[i][j] = ST[i][j - 1];
else ST[i][j] = ST[i + (1 << (j - 1))][j - 1];
}
int main ()
{
ifstream fin ("lca.in");
ofstream fout ("lca.out");
fin >> N >> M;
for (int i = 2, a; i <= N; i++)
{
fin >> a;
muchii[a].push_back (i);
}
DFS (1, 0);
Precalc_ST ();
for (int i, j, k; M; M--)
{
fin >> i >> j;
i = indice[i];
j = indice[j];
if (i > j) swap (i, j);
for (k = 0; (1 << k) <= j - i + 1; k++);
k--;
fout << min (Rep_Euler[ST[i][k]], Rep_Euler[ST[j - (1 << k) + 1][k]]) << "\n";
}
fin.close ();
fout.close ();
return 0;
}