Pagini recente » Cod sursa (job #517356) | Cod sursa (job #1631686) | Cod sursa (job #2864779) | Cod sursa (job #3161163) | Cod sursa (job #3263411)
#include <bits/stdc++.h>
#define NMAX 100100
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
unordered_map<int,int> um;
vector<int> e[100005];
vector<pair<int,int>> euler;
void dfs(int node, int depth)
{
euler.emplace_back(depth, node);
for(auto adj : e[node])
{
dfs(adj, depth+1);
euler.emplace_back(depth, node);
}
}
pair<int,int> rmq[200005][18];
int p2[200005];
int main()
{
int n, m;
fin >> n >> m;
for(int i = 2; i<=n ;i++)
{
int x;
fin >> x;
e[x].push_back(i);
}
dfs(1,0);
n = euler.size();
int f = 0;
for(int i = 1; i<=n; i++)
{
if(i == (1<<(f+1)))
f++;
p2[i] = f;
}
for(int i = 1; i<=n; i++)
rmq[i][0] = euler[i-1];
for(int j = 1; j<=p2[n]; j++)
{
for(int i = 1; i + (1<<(j-1)) <= n; i++)
rmq[i][j] = min(rmq[i][j-1], rmq[i+(1<<(j-1))][j-1]);
}
for(int i = 0; i<n; i++)
if(um[euler[i].second] == 0)
um[euler[i].second] = i+1;
for(int i = 1; i<=m; i++)
{
int x, y;
fin >> x >> y;
x = um[x];
y = um[y];
if(y < x)
swap(y,x);
int l = p2[y-x+1];
fout << min(rmq[x][l], rmq[y-(1<<l)+1][l]).second << '\n';
}
return 0;
}