Pagini recente » Cod sursa (job #2620625) | Borderou de evaluare (job #2155655) | Cod sursa (job #699975) | Cod sursa (job #2505723) | Cod sursa (job #2397902)
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,i,x,y,sq,viz[100005],tata[100005],tata_block[100005],adancime[100005],viz1[100005],Max;
vector <int> G[100005];
void dfs1(int nod, int d){
viz1[nod] = 1;
adancime[nod] = d;
Max = max(Max,d);
for(int i=0;i<G[nod].size();i++)
if(viz1[G[nod][i]] == 0)
dfs1(G[nod][i],d+1);
}
void dfs(int nod, int db,int parinte_bloc){
viz[nod] = 1;
if(db > sq){
db = 1;
parinte_bloc = tata[nod];
}
tata_block[nod] = parinte_bloc;
for(int i=0;i<G[nod].size();i++)
if(viz[G[nod][i]] == 0)
dfs(G[nod][i],db+1,parinte_bloc);
}
int main()
{
f>>n>>m;
for(i=1;i<=n-1;i++)
{
f>>x;
tata[i+1]=x;
G[x].push_back(i+1);
G[i+1].push_back(x);
}
dfs1(1,1);
sq = sqrt(Max);
dfs(1,1,0);
for(i=1;i<=m;i++)
{
f>>x>>y;
while(tata_block[x]!=tata_block[y]){
if(adancime[x]> adancime [y])
x = tata_block[x];
else
y = tata_block[y];
}
while(x!=y){
if(adancime[x]>adancime[y])
x = tata[x];
else
y = tata[y];
}
g<<x<<'\n';
}
return 0;
}