Pagini recente » Cod sursa (job #2679020) | Cod sursa (job #2999475) | Cod sursa (job #909844) | Cod sursa (job #2662352) | Cod sursa (job #3124083)
#include <bits/stdc++.h>
#define cin in
#define cout out
using namespace std;
const string file_name("lca");
ifstream in(file_name + ".in");
ofstream out(file_name + ".out");
int n,m,x,y;
vector<int> G[100005],v;
int st[100005],cnt,rmq[20][200005],Log[200005];
void dfs(int k)
{
v.push_back(k);
cnt++;
st[k] = cnt;
for (auto x : G[k])
if(x!=k)
{
dfs(x);
v.push_back(k);
cnt++;
}
}
void logaritm()
{
Log[1] = 0;
for (int i = 2; i <= cnt; i++)
Log[i] = Log[i / 2] + 1;
}
void init()
{
logaritm();
for (int i = 1; i <= cnt; i++)
rmq[0][i] = v[i];
for (int i = 1; (1 << i) <= cnt; i++)
for (int j = (1 << i); j <= cnt; j++)
{
int k = 1 << (i - 1);
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j - k]);
}
}
int queryRMQ(int x, int y)
{
int k = Log[y - x + 1];
return min(rmq[k][x + (1 << k) - 1], rmq[k][y]);
}
int main()
{
cin>>n>>m;
for(int i=2;i<=n;i++)
cin>>x,G[x].push_back(i);
v.push_back(0);
dfs(1);
init();
while(m--)
{
cin>>x>>y;
x=st[x],y=st[y];
if(x>y) swap(x,y);
cout<<queryRMQ(x,y)<<'\n';
}
return 0;
}