Pagini recente » Cod sursa (job #476822) | Cod sursa (job #1800063) | Cod sursa (job #2988585) | Cod sursa (job #3274020) | Cod sursa (job #1538575)
///O(SQRT(N))
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
struct Nod
{
int nod;
Nod *urm;
};
typedef Nod *PNod;
PNod List[100001];
void add(int x,int y)
{
PNod p = new Nod;
p -> nod = y;
p -> urm = List[x];
List[x] = p;
}
int L[100001];
int T[100001];
int P[100001];
int H,N,Tst;
void dfs(int node,int nr)
{
if(L[node] < nr)
P[node] = 1;
else
if(!(L[node] % nr))
P[node] = T[node];
else
P[node] = P[ T[node] ];
for(PNod p = List[node]; p; p = p -> urm)
dfs(p -> nod,nr);
}
int LCA(int x,int y)
{
while(P[x] != P[y])
{
if(L[x] > L[y])
x = P[x];
else
y = P[y];
}
while(x != y)
{
if(L[x] > L[y])
x = T[x];
else
y = T[y];
}
return x;
}
int main()
{
int x,y;
f >> N >> Tst;
L[1] = 0;
H = 0;
for(int i = 2; i <= N; i++)
{
f >> T[i];
add(T[i],i);
L[i] = L[ T[i] ] + 1;
if(L[i] > H)
H = L[i];
}
int nr = sqrt(H);
dfs(1,nr);
for(int i = 1; i <= Tst; i++)
{
f >> x >> y;
g << LCA(x,y) << "\n";
}
return 0;
}