Pagini recente » Cod sursa (job #360986) | Cod sursa (job #185256) | Cod sursa (job #941555) | Cod sursa (job #418284) | Cod sursa (job #1337811)
#include<fstream>
#include<vector>
using namespace std;
typedef int var;
ifstream fin("lca.in");
ofstream fout("lca.out");
const var LEN = 100;
const var MAXN = 100001;
var PARENT2[MAXN], PARENT[MAXN], RANK[MAXN];
vector<var> FII[MAXN];
void makepar(var node, var p) {
PARENT2[node] = p;
RANK[node] = RANK[PARENT[node]] + 1;
for(vector<var>::iterator it = FII[node].begin(); it != FII[node].end(); ++it) {
if(RANK[node]%LEN == 0) {
makepar(*it, node);
} else {
makepar(*it, p);
}
}
}
var lca(var a, var b) {
while(PARENT2[a] != PARENT2[b]) {
a = PARENT2[a];
b = PARENT2[b];
}
while(RANK[a] > RANK[b]) {
a = PARENT[a];
}
while(RANK[b] > RANK[a]) {
b = PARENT[b];
}
while(a != b) {
a = PARENT[a];
b = PARENT[b];
}
return a;
}
int main() {
var n, m, a, b;
fin>>n>>m;
for(var i=2; i<=n; i++) {
fin>>PARENT[i];
FII[PARENT[i]].push_back(i);
}
makepar(1, 0);
while(m--) {
fin>>a>>b;
fout<<lca(a, b)<<'\n';
}
return 0;
}