Pagini recente » Cod sursa (job #1689097) | Cod sursa (job #434769) | Cod sursa (job #2485664) | Cod sursa (job #3154787) | Cod sursa (job #1651041)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("memo.in");
ofstream g("memo.out");
int arbt[1001], niv[1001], n;
void calc_nivel(int nv) {
if (niv[arbt[nv]] == 0)
calc_nivel(arbt[nv]);
niv[nv] = 1 + niv[arbt[nv]];
}
int lca(int a, int b) {
int c, nivc;
while (niv[a] != niv[b]) {
if (niv[a]>niv[b])
a = arbt[a];
else
b = arbt[b];
}
while (arbt[a] != arbt[b]) {
a = arbt[a];
b = arbt[b];
}
c = arbt[a];
return c;
}
bool ramura(int a, int b) {
int c, ok=1;
if (niv[a]>niv[b]) {
while (arbt[a]!=0 && ok==1) {
if (arbt[a] == b)
ok = 0;
a = arbt[a];
}
}
else
while (arbt[b]!=0 && ok==1) {
if (arbt[b] == a)
ok = 0;
b = arbt[b];
}
if (ok==1)
return false;
else
return true;
}
int main()
{
int i, x, y, m, j, rad;
f>>n;
for (i=1;i<=n;i++) {
f>>arbt[i];
if (arbt[i]==0)
rad = i;
}
f>>m;
niv[rad]=1;
for (i=1;i<=n;i++) {
if (niv[i]==0)//optimizare
calc_nivel(i);
}
int dist;
for (i=1;i<=m;i++) {
f>>x>>y;
if (ramura(x,y) == true)
dist = niv[x] - niv[y];
else
dist = niv[x] + niv[y] - 2*niv[lca(x,y)];
cout<<lca(x,y)<<" "<<dist<<endl;
}
return 0;
}