Pagini recente » Cod sursa (job #1483190) | Cod sursa (job #2584192) | Cod sursa (job #1182496) | Cod sursa (job #699519) | Cod sursa (job #2640596)
#include <iostream>
#include <fstream>
#include <vector>
#define INF 100100
#define N 18
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n;
int low[INF];
int m;
pair <int, int>query;
vector <int>NOD[INF];
int euleR[INF * 4];
int point;
int position[INF];
int rmq[N][INF * 4];
int ans[INF * 4];
inline void read()
{
f >> n;
f >> m;
for (int i = 1; i <= n - 1; ++i)
{
f >> low[i];
}
}
void DFS(int x)
{
point++;
euleR[point] = x;
for (int i = 0; i < NOD[x].size(); ++i)
{
DFS(NOD[x][i]);
point++;
euleR[point] = x;
}
}
inline void euler()
{
for (int i = 1; i <= n; ++i)
{
NOD[low[i]].push_back(i + 1);
}
DFS(1);
for (int i = 1; i <= point; ++i)
{
if (position[euleR[i]] == 0)
{
position[euleR[i]] = i;
}
}
}
int minim(int x, int y)
{
if (x < y)
return x;
else return y;
}
inline void RMQ()
{
for (int i = 1; i <= point; ++i)
{
rmq[0][i] = euleR[i];
}
for (int i = 1; (1 << i) <= point; ++i)
{
for (int j = 1; (j + (1 << i)) <= point; ++j)
{
rmq[i][j] = minim(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
}
}
ans[1] = 0;
for (int i = 2; i <= point; ++i)
{
ans[i] = ans[i / 2] + 1;
}
}
inline void RMQ_answer(int x, int y)
{
int length = y - x + 1;
g << minim(rmq[ans[length]][1], rmq[ans[length]][1]) << "\n";
}
inline void writtlen()
{
for (int i = 1; i <= m; ++i)
{
f >> query.first >> query.second;
RMQ_answer(position[query.first], position[query.second]);
}
}
int main()
{
read();
euler();
RMQ();
writtlen();
return 0;
}