Pagini recente » Cod sursa (job #1136510) | Cod sursa (job #3215434) | Cod sursa (job #2559766) | Cod sursa (job #766877) | Cod sursa (job #1679607)
#include <fstream>
#define nmax 100005
using namespace std;
unsigned int t[nmax],h;
unsigned int niv[nmax];
unsigned int log2[nmax];
unsigned int P[18][nmax];
void dfs(unsigned int n)
{
unsigned int i,x;
niv[1]=1;
for (i=2;i<=n;i++)
{
x=i;
while (x)
{
x=t[x];
niv[i]++;
}
h=max(h,niv[i]);
}
}
unsigned int querry(unsigned int p, unsigned int q)
{
int i;
if (niv[p]<niv[q]) swap(p,q);
for (i=log2[niv[p]];i>=0;i--)
{
if ((int)(niv[p]-(1<<i))>=(int)(niv[q]))
p=P[i][p];
}
if (p==q) return p;
for (i=log2[niv[p]];i>=0;i--)
{
if (P[i][p] && P[i][p]!= P[i][q])
{
p=P[i][p];
q=P[i][q];
}
}
return t[p];
}
int main()
{
ifstream f("lca.in");
ofstream g("lca.out");
unsigned int i,n,m,j,p,q;
f>>n>>m;log2[1]=0;
for (i=2;i<=n;i++)
{
f>>t[i];
P[0][i]=t[i];
}
dfs(n);
for (i=2;i<=h;i++)
{
log2[i]=log2[i/2]+1;
}
for (i=1;i<=log2[h];i++)
{
for (j=2;j<=n;j++)
{
P[i][j]=P[i-1][ P[i-1][j] ];
}
}
for (i=1;i<=m;i++)
{
if (i==230)
p=1;
f>>p>>q;
g<<querry(p,q)<<'\n';
}
f.close();
g.close();
return 0;
}