Pagini recente » Cod sursa (job #1268697) | Cod sursa (job #1388433) | Cod sursa (job #1416079) | Cod sursa (job #2820370) | Cod sursa (job #1927157)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int T[100001], T2[100001], LEV[100001];
int H = 200;
int N;
vector <int> G[100001];
void df(int n, int t2, int l){
vector <int> :: iterator it;
int i;
LEV[n] = l;
T2[n] = t2;
if( l % H == 0 )
t2 = n;
for(it = G[n].begin(); it != G[n].end(); it++)
df(*it,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];
G[T[i]].push_back(i);
}
df(1,1,1);
for(i = 1; i <= m; i++){
f >> x >> y;
g << lca(x, y) << '\n';
}
return 0;
}