Pagini recente » Cod sursa (job #288300) | Profil tamthegod | Cod sursa (job #1531430) | Cod sursa (job #1719141) | Cod sursa (job #3271346)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
vector<int> G[100002];
int m[17][100002];
int parcurgere[400003];
int n , q;
int fa[100002];
int hn[100002];
bool u[100002];
int len;
void citire()
{
int x , y;
cin >> n >> q ;
for(int i = 2 ; i<=n ; i++)
{
cin >> x ;
G[i].push_back(x);
G[x].push_back(i);
}
}
void build_table()
{
for(int i = 1; (1<<i) < len ; i++)
for(int j = 1 ; j + (1<<i) - 1 <=len ; j++)
{
if(hn[m[i-1][j]] < hn[m[i-1][j+(1<<(i-1))]])
m[i][j] = m[i-1][j];
else m[i][j] = m[i-1][j+(1<<(i-1))];
}
}
void afisare()
{
cout << '\n';
for(int i = 0; (1<<i) < len ; i++ , cout << '\n')
for(int j = 1 ; j + (1<<i) - 1 <=len ; j++)
cout << m[i][j] << ' ';
cout << '\n';
}
int query(int x , int y)
{
int log = 31-__builtin_clz(y-x+1);
return min(m[log][x] , m[log][y-(1<<log) + 1]);
}
void dfs(int nod , int h = 1)
{
m[0][++len] = nod;
u[nod] = 1;
hn[nod] = h;
fa[nod] = len;
for(int i = 0 ; i<G[nod].size() ; i++)
if(!u[G[nod][i]])
{
dfs(G[nod][i],h+1);
m[0][++len] = nod;
}
}
int main()
{
citire();
dfs(1);
build_table();
int x , y;
while(q--)
{
cin >> x >> y;
if(fa[x] < fa[y])
cout << query(fa[x] , fa[y]) << '\n';
else cout << query(fa[y] , fa[x]) << '\n';
}
}