Pagini recente » Clasament dornescu2 | Cod sursa (job #454091) | Cod sursa (job #1676074) | Cod sursa (job #36189) | Cod sursa (job #1318261)
#include<fstream>
using namespace std;
typedef int var;
ifstream fin("lca.in");
ofstream fout("lca.out");
var *PARENT, *RANK, *PARENTX;
var n;
bool C[100001];
inline var lca(var &a, var &b) {
while(RANK[PARENTX[a]] >= RANK[b]) a = PARENTX[a];
while(RANK[PARENTX[b]] >= RANK[a]) b = PARENTX[b];
while(RANK[a] > RANK[b]) a = PARENT[a];
while(RANK[b] > RANK[a]) b = PARENT[b];
while(PARENTX[a] != PARENTX[b]) {a = PARENTX[a]; b = PARENTX[b];}
while(a!=b) {a = PARENT[a]; b = PARENT[b];}
return a;
}
var t;
inline void makeParentX(const var &nod, const var &X) {
t = nod;
for(var i=1; i<=X && t; i++) {
t = PARENT[t];
}
PARENTX[nod] = t;
}
int main() {
var i, q;
var a, b;
fin>>n>>q;
PARENT = new var[n+1];
RANK = new var[n+1];
PARENTX = new var[n+1];
PARENT[1] = PARENTX[1] = RANK[1] = 0;
PARENT[0] = PARENTX[0] = 0;
RANK[0] = -1;
for(i=2; i<=n; i++) {
fin>>PARENT[i];
RANK[i] = RANK[PARENT[i]] + 1;
makeParentX(i, 80);
}
while(q--) {
fin>>a>>b;
fout<<lca(a, b)<<'\n';
}
return 0;
}