Pagini recente » Cod sursa (job #2463856) | Cod sursa (job #442308) | Cod sursa (job #1602340) | Rating Ilinca Sergiu Cosmin (Sergiu2004) | Cod sursa (job #1309852)
#include<fstream>
#include<vector>
#define NMAX 102
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> PARENT;
vector<int> RANK;
int n, t;
int makeRank(int i) {
if(i == 1) return 0;
if(RANK[i]) return RANK[i];
else RANK[i] = makeRank(PARENT[i]) + 1;
}
int lca (int a, int b) {
while(RANK[a] > RANK[b]) {
a = PARENT[a];
}
while(RANK[b] > RANK[a]) {
b = PARENT[b];
}
while(b != a) {
a = PARENT[a];
b = PARENT[b];
}
return a;
}
int main() {
fin>>n>>t;
PARENT.resize(n+1, 0);
RANK.resize(n+1, 0);
for(int i=2; i<=n; i++) {
fin>>PARENT[i];
RANK[i] = RANK[PARENT[i]] + 1;
}
int a, b;
for(int i=1; i<=t; ++i) {
fin>>a>>b;
fout<<lca(a, b)<<'\n';
}
return 0;
}