Pagini recente » Cod sursa (job #2023812) | Cod sursa (job #1950319) | Cod sursa (job #1413890) | Cod sursa (job #752847) | Cod sursa (job #1930260)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
#define Max 100001
vector <int> G[Max];
int T[Max], T2[Max], LEV[Max], N;
int H = 200;
void df(int n, int t2, int l){
vector <int> :: iterator it;
T2[n] = t2;
LEV[n] = l;
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, i, x, y;
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;
}