Pagini recente » Cod sursa (job #1641868) | Cod sursa (job #931178) | Cod sursa (job #1725300) | Cod sursa (job #1342975) | Cod sursa (job #2169851)
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
int a[10][2*Nmax] , poz , first[Nmax],i,n,m,j,x,y,t,k,poz_st,poz_dr;
pair < int,int > euler[2*Nmax];
vector < int > v[Nmax];
inline void bfs(int nod,int niv)
{
int l = v[nod].size(),next_nod; euler[++poz] = {nod,niv};
if(not first[nod])
first[nod] = poz;
for(int i = 0;i < l;i++)
{
next_nod = v[nod][i];
bfs(next_nod , niv + 1);
euler[++poz] = {nod,niv};
}
}
inline void rmq()
{
for(i = 1;i <= poz;i++)
a[0][i] = i;
k = 1;
m = log2(poz);
for(i = 1;i <= m;i++)
{
for(j = 1;j <= poz - 2*k + 1;j++)
{
poz_st = a[i - 1][j]; poz_dr = a[i - 1][j + k];
if(euler[poz_st].second < euler[poz_dr].second)
a[i][j] = poz_st;
else a[i][j] = poz_dr;
}
k *= 2;
}
}
int main()
{
f >> n >> t;
for(i = 2;i <= n;i++)
f >> x,v[x].push_back(i);
bfs(1,1);
rmq();
for(i = 1;i <= t;i++)
{
f >> x >> y;
x = first[x];
y = first[y];
if(x > y)
swap(x,y);
k = log2(y - x + 1);
m = pow(2,k);
poz_st = a[k][x];
poz_dr = a[k][y - m + 1];
if(euler[poz_st].second < euler[poz_dr].second)
g << euler[poz_st].first << '\n';
else g << euler[poz_dr].first << '\n';
}
return 0;
}