Pagini recente » Cod sursa (job #748501) | Cod sursa (job #1843980) | Cod sursa (job #684575) | Cod sursa (job #1861982) | Cod sursa (job #3233067)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, q, x, t, euler[2*100005], prima[100005], nivel[100005], i, j, y;
vector<int>v[100005];
pair<int, int>dp[100005][25];
void dfs(int nod, int prec) {
euler[++t]=nod;
prima[nod]=t;
nivel[nod]=nivel[prec]+1;
for (int i:v[nod]) {
if (i!=prec) {dfs(i, nod); euler[++t]=nod;}
}
}
int query(int a, int b) {
int lg=log2(b-a+1);
if (dp[lg][a].first<dp[lg][b-(1<<lg)+1].first) return dp[lg][a].second;
else return dp[lg][b-(1<<lg)+1].second;
}
int main()
{
fin>>n>>q;
for (i=2; i<=n; i++) {
fin>>x;
v[i].push_back(x);
v[x].push_back(i);
}
dfs(1, 0);
for (i=1; i<=t; i++) {
dp[0][i]={nivel[euler[i]], euler[i]};
}
for (i=1; i<=20; i++) {
for (j=1; j<=t-(1<<i)+1; j++) {
if (dp[i-1][j].first<dp[i-1][j+(1<<(i-1))].first) {
dp[i][j]=dp[i-1][j];
}
else dp[i][j]=dp[i-1][j+(1<<(i-1))];
}
}
cout<<prima[10]<<' '<<prima[11];
while (q--) {
fin>>x>>y;
x=prima[x];
y=prima[y];
if (x>y) swap(x, y);
fout<<query(x, y)<<'\n';
}
return 0;
}