Pagini recente » Cod sursa (job #1018976) | Cod sursa (job #1279291) | Cod sursa (job #409366) | Cod sursa (job #2756072) | Cod sursa (job #2443571)
#include <bits/stdc++.h>
#define NM 100005
#define pii pair<int,int>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,k,lg[4*NM],poz[NM],dp[20][4*NM],dp2[20][4*NM];
vector <pii> v;
vector <int> fii[NM];
void Read();
void Solve();
void Euler(int,int);
void LCA(int,int);
void RMQ();
int main()
{ Read();
Solve();
return 0;
}
void Read()
{ f>>n>>m;
for(int i=2; i<=n; i++)
{ int x;
f>>x;
fii[x].push_back(i);
}
}
void Solve()
{ Euler(1,0);
for(int i=2; i<4*NM; i++) lg[i]=lg[i/2]+1;
RMQ();
while(m--)
{ int x,y;
f>>x>>y;
LCA(x,y);
}
}
void RMQ()
{ int l=lg[v.size()];
for(int i=1; i<=v.size(); i++)
{ dp[0][i]=v[i-1].second;
dp2[0][i]=v[i-1].first;
}
for(int i=1; i<=l; i++)
for(int j=1; j<=v.size()-(1<<(i-1)); j++)
{ if(dp[i-1][j]<dp[i-1][j+(1<<(i-1))])
{ dp[i][j]=dp[i-1][j];
dp2[i][j]=dp2[i-1][j];
}
else
{ dp[i][j]=dp[i-1][j+(1<<(i-1))];
dp2[i][j]=dp2[i-1][j+(1<<(i-1))];
}
}
}
void Euler(int nod,int nivel)
{ v.push_back({nod,nivel});
poz[nod]=v.size();
for(int i=0; i<fii[nod].size(); i++)
{ int fc=fii[nod][i];
Euler(fc,nivel+1);
v.push_back({nod,nivel});
}
}
void LCA(int x,int y)
{ int pozX=poz[x],pozY=poz[y];
int l=lg[pozY-pozX];
if(pozX>pozY) swap(pozX,pozY);
if(dp[l][pozX]<dp[l][pozY-(1<<l)+1])
g<<dp2[l][pozX]<<'\n';
else
g<<dp2[l][pozY-(1<<l)+1]<<'\n';
}