Pagini recente » Cod sursa (job #730951) | Cod sursa (job #1367872) | Cod sursa (job #949138) | Cod sursa (job #968673) | Cod sursa (job #3036798)
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int NMAX = 1e5 + 1;
const int logmax = 17;
int lift[logmax + 1][NMAX],level[NMAX];
void go(int i)
{
if(level[i] || i == 1) return;
go(lift[0][i]); level[i] = level[lift[0][i]] + 1;
}
int lca(int a,int b)
{
if(level[a] < level[b]) swap(a,b);
for(int i = logmax ; i >= 0 ; i--) if(level[a] - (1 << i) >= level[b]) a = lift[i][a];
if(a == b) return a;
for(int h = logmax ; h >= 0 ; h--)
{
if(lift[h][a] != lift[h][b])
{
a = lift[h][a];
b = lift[h][b];
}
}
return lift[0][a];
}
int main()
{
int n,q,a,b; cin >> n >> q;
for(int i = 2; i <= n ; i++) cin >> lift[0][i];
for(int i = 1; i <= logmax ; i++)
for(int j = 2; j <= n ; j++)
lift[i][j] = lift[i - 1][lift[i - 1][j]];
for(int i = 2; i <= n ; i++) go(i);
while(q--)
{
cin >> a >> b;
cout << lca(a,b) << '\n';
}
}