Pagini recente » Cod sursa (job #1039995) | Cod sursa (job #2602596) | Cod sursa (job #1765173) | Cod sursa (job #1171965) | Cod sursa (job #1341599)
#include<fstream>
#include<vector>
using namespace std;
typedef int var;
ifstream fin("lca.in");
ofstream fout("lca.out");
const var MAXN = 100001;
vector<var> G[MAXN];
var D[MAXN], PARENT[MAXN], PARENT2[MAXN], P_D[MAXN];
void dfs(var node) {
PARENT2[node] = P_D[D[node]/2];
P_D[D[node]] = node;
for(vector<var>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
D[*it] = D[node] + 1;
dfs(*it);
}
}
inline var lca(var a, var b) {
while(D[PARENT2[a]] >= D[b]) {
a = PARENT2[a];
}
while(D[PARENT2[b]] >= D[a]) {
b = PARENT2[b];
}
while(D[a] > D[b]) {
a = PARENT[a];
}
while(D[b] > D[a]) {
b = PARENT[b];
}
while(PARENT2[a] != PARENT2[b]) {
a = PARENT2[a];
b = PARENT2[b];
}
while(a != b) {
a = PARENT[a];
b = PARENT[b];
}
return a;
}
void citire() {
var n, m, a, b;
fin>>n>>m;
for(var i=2; i<=n; i++) {
fin>>PARENT[i];
G[PARENT[i]].push_back(i);
}
dfs(1);
while(m--) {
fin>>a>>b;
if (a == 1 || b == 1) {
fout<<1<<'\n';
}
fout<<lca(a, b)<<'\n';
}
}
int main() {
citire();
return 0;
}