Pagini recente » eusebiu_oji_2015_cls10 | Cod sursa (job #1373449) | Cod sursa (job #2542693) | Cod sursa (job #2913042) | Cod sursa (job #2189433)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector <int>v[100005];
int stra[20][100005],n,m,viz[100005],niv[100005],x,y;
void dfs(int x)
{
viz[x]=1;
for (int i=0; i<v[x].size(); i++)
if (!viz[v[x][i]]) niv[v[x][i]]=niv[x]+1,dfs(v[x][i]);
}
int lca(int x, int y)
{
if (niv[x]<niv[y]) swap(x,y);
int log1,log2;
for (log1=0; (1<<log1)<=niv[x]; ++log1);
for (log2=0; (1<<log2)<=niv[y]; ++log2);
for(int i=log1; i>=0; --i)
if(niv[x]-(1<<i)>=niv[y])
x=stra[i][x];
if(x==y) return x;
for(int i=log2; i>=0; --i)
if(stra[i][x] && stra[i][x]!=stra[i][y])
{
x=stra[i][x];
y=stra[i][y];
}
return stra[0][x];
}
int main()
{
in>>n>>m;
for (int i=2; i<=n; i++)
{
in>>stra[0][i];
v[stra[0][i]].push_back(i);
}
for (int i=1; i<=18; i++)
for (int j=1; j<=n; j++)
stra[i][j]=stra[i-1][stra[i-1][j]];
dfs(1);
for (int i=1; i<=m; i++)
{
in>>x>>y;
out<<lca(x,y)<<'\n';
}
return 0;
}