Pagini recente » Cod sursa (job #437488) | Cod sursa (job #1268954) | Cod sursa (job #1728834) | Cod sursa (job #145061) | Cod sursa (job #3246991)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
map<int, int>e, n;
map<int, pair<int, int>>r[35];
vector<int>v[100005];
int k, x, nivel, i, a, b, p[100005], nn, m;
void euler(int x) {
cout<<x<<' ';
e[++k]=x;
n[k]=nivel;
nivel++;
for (auto i:v[x]) {
euler(i);
e[++k]=x;
n[k]=nivel-1;
cout<<x<<' ';
}
nivel--;
}
void rmq() {
int y=1, z=k, x=2, j, i;
for (i=1; i<=k; i++) {
r[1][i]={n[i], e[i]};
}
while (x<=k) {
y++;
for (i=1; i<=z-x; i++) {
r[y][i]=min(r[y-1][i], r[y-1][i+x]);
}
z-=x;
x*=2;
}
}
pair<int, int> minim(int i, int j) {
int x=log2(j-i+1);
return min(r[x][i], r[x][j-(1<<x)+1]);
}
int main()
{
fin>>nn>>m;
for (i=1; i<=nn-1; i++) {
fin>>x;
v[x].push_back(i+1);
}
cout<<'\n'<<'\n';
nivel=1;
euler(1);
cout<<'\n'<<'\n';
rmq();
for (i=1; i<=k; i++) {
if (p[e[i]]==0) p[e[i]]=i;
}
for (i=1; i<=m; i++) {
fin>>a>>b;
if (p[a]>p[b]) fout<<minim(p[b], p[a]).second<<'\n';
else fout<<minim(p[a], p[b]).second<<'\n';
}
return 0;
}