Pagini recente » Cod sursa (job #592355) | Cod sursa (job #2242249) | Cod sursa (job #1178355) | Cod sursa (job #2657702) | Cod sursa (job #1927136)
#include <fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int T[100001], T2[100001], LEV[100001];
int H = 10;
int N;
void df(int n, int t2, int l){
int i;
LEV[n] = l;
T2[n] = t2;
if( l % H == 0 )
t2 = n;
for(i = 1; i <= N; i++)
if(T[i] == n)
df(i,t2,l+1);
}
int lca(int x, int y){
while(T2[x] != T2[y])
if(LEV[x] > LEV[y])
x = T2[x];
else
y = T2[y];
while(x != y)
if(LEV[x] > LEV[y])
x = T[x];
else
y = T[y];
return x;
}
int main()
{
int m, x, y, i;
f >> N >> m;
for(i = 2; i <= N; i++)
f >> T[i];
df(1,1,1);
for(i = 1; i <= m; i++){
f >> x >> y;
g << lca(x, y) << '\n';
}
return 0;
}