Pagini recente » Cod sursa (job #1763054) | Cod sursa (job #1438543) | Cod sursa (job #1462643) | Cod sursa (job #530848) | Cod sursa (job #2719786)
#include <fstream>
#define mF "lca"
std::ifstream in(mF ".in");
std::ofstream out(mF ".out");
constexpr int log(int e) {return e? log(e >> 1) + 1: 1;}
const int N = 100001; int S[log(N)][N], V[N];
int Q(int s, int i) {for (int p = 0; s; p++, s >>= 1) if (s & 1) i = S[p][i]; return i;}
#include <vector>
std::vector<int> L[N];
void DFS(int t) {for (int f: L[t]) V[f] = V[t] + 1, DFS(f);}
int main()
{
int n, m; in >> n >> m; for (int i = 2; i <= n; i++) in >> (*S)[i], L[(*S)[i]].push_back(i);
for (int p = 1, ln = log(n); p < ln; p++) for (int i = 1; i <= n; i++) S[p][i] = S[p-1][ S[p-1][i] ];
DFS(1); while (m--)
{
int a, b; in >> a >> b;
if (V[b] < V[a]) std::swap(a, b);
b = Q(V[b] - V[a], b);
int i = 0, j = V[a], m; while (i <= j)
if (m = i+j>>1, Q(m, a) == Q(m, b)) j = m - 1; else i = m + 1;
out << Q(i, a) << '\n';
}
}