Pagini recente » Cod sursa (job #2474617) | Cod sursa (job #460902) | Cod sursa (job #2485168) | Cod sursa (job #1099268) | Cod sursa (job #1290877)
#include<iostream>
#include<vector>
#include<math.h>
#include<fstream>
#define Nmax 100001
using namespace std;
void build(int node, vector<int> G[], int T2[], int level[], int lev, int H, int val)
{
level[node] = lev;
T2[node] = val;
if( (lev - 1) % H == 0)
val = node;
for(auto it = G[node].begin(); it != G[node].end(); ++it)
build(*it, G, T2, level, lev+1, H, val);
}
int query(int x, int y, int T[], int T2[], int level[])
{
while(T2[x] != T2[y])
if(level[x] >= level[y])
x = T2[x];
else
y = T2[y];
while(x != y)
if(level[x] >= level[y])
x = T[x];
else
y = T[y];
return x;
}
int main()
{
int N, M, T[Nmax], T2[Nmax], lev[Nmax];
vector<int> G[Nmax];
ifstream f("lca.in");
f>>N>>M;
T[1] = 1;
for(int i=2;i<=N;++i)
{
f>>T[i];
G[T[i]].push_back(i);
}
int H = sqrt(N);
build(1, G, T2, lev, 1, H, 1);
int x, y;
ofstream g("lca.out");
while(M--)
{
f>>x>>y;
g<<query(x, y, T, T2, lev)<<"\n";
}
f.close();
return 0;
}