Pagini recente » Cod sursa (job #1539776) | Cod sursa (job #1172850) | Istoria paginii utilizator/profcntv | Cod sursa (job #251134) | Cod sursa (job #1548261)
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> G[100001];
int P[100001],H[100001],T[100001];
int n,m;
int LCA(int x, int y)
{
while(P[x] != P[y])
if(H[x] > H[y]) x = P[x];
else y = P[y];
while(x != y)
if(H[x] > H[y]) x = T[x];
else y = T[y];
return x;
}
void dfs(int node, int split)
{
if(H[node] < split) P[node] = 1;
else
if(H[node] % split == 0) P[node] = T[node];
else P[node] = P[T[node]];
for(vector<int>::iterator it = G[node].begin(); it != G[node].end(); ++it)
dfs(*it,split);
}
int main()
{
int x,y,HMax = 0;
f >> n >> m;
H[1] = 0;
for(int i = 2; i <= n; ++i)
{
f >> T[i];
G[T[i]].push_back(i);
H[i] = H[T[i]] + 1;
if(H[i] > HMax) HMax = H[i];
}
int split = sqrt(HMax);
dfs(1,split);
for(int i = 1; i <= m; ++i)
{
f >> x >> y;
g << LCA(x,y) << "\n";
}
return 0;
}