Pagini recente » Cod sursa (job #1004729) | Cod sursa (job #340837) | Cod sursa (job #2920451) | Cod sursa (job #1699208) | Cod sursa (job #2084652)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout ("lca.out");
const int N_MAX = 100005;
int n, m;
int euler[3 * N_MAX], ne;
int poz[N_MAX], niv[N_MAX];
vector<int> vec[N_MAX];
void make_euler(int nod, int nivel){
euler[++ne] = nod;
niv[ne] = nivel;
poz[nod] = ne;
for(auto v : vec[nod]){
make_euler(v, nivel + 1);
euler[++ne] = nod;
niv[ne] = nivel;
}
}
int main()
{
fin >> n >> m;
for(int i = 2, x; i<=n; ++i){
fin >> x; vec[x].push_back(i);
}
make_euler(1, 0);
// for(int i = 1; i<=ne; ++i)
// cout << euler[i] << " ";
// cout << endl;
// for(int i = 1; i<=ne; ++i)
// cout << niv[i] << " ";
while(m--){
int a, b; fin >> a >> b;
int minn = INT_MAX;
int ans = 0;
for(int i = min(poz[a], poz[b]); i<=max(poz[a], poz[b]); ++i){
if (niv[i] < minn){
minn = niv[i];
ans = euler[i];
}
}
fout << ans << endl;
}
return 0;
}