Pagini recente » Cod sursa (job #351199) | Cod sursa (job #3346893) | Cod sursa (job #3351537) | Cod sursa (job #1389054) | Cod sursa (job #3323617)
#include <iostream>
#include <random>
#include <fstream>
#include <bitset>
#include <map>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> L[100002];
int dp[18][100001];
int lvl[100001];
void dfs(int nod) {
for (auto it:L[nod])
lvl[it]=1+lvl[nod],dfs(it);
}
int kstramos(int val,int k) {
int sol=val;
for (int i=0; (1<<i)<=k; i++)
if ((1<<i) & k)
val=dp[i][val];
return val;
}
int lca(int x, int y) {
int st=0,dr=min(lvl[x],lvl[y]);
int sol=0;
while (st<=dr) {
int mij=(st+dr)/2;
int val1=kstramos(x,lvl[x]-mij);
int val2=kstramos(y,lvl[y]-mij);
if (val1==val2)
sol=val1,st=mij+1;
else
dr=mij-1;
}
return sol;
}
int main() {
int n,q;
fin>>n>>q;
dp[0][1]=1;
for (int i=2; i<=n; i++) {
fin>>dp[0][i];
L[dp[0][i]].push_back(i);
}
dfs(1);
for (int i=1; (1<<i)<=n; i++)
for (int j=1; j<=n; j++)
dp[i][j]=dp[i-1][dp[i-1][j]];
while (q--) {
int x,y;
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
return 0;
}