Pagini recente » Cod sursa (job #2034571) | Cod sursa (job #1184888)
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,a[100005],Euler[200005],lg,nivel[200005],rmq[200005],puteri[25];
int mat[200005][20];
vector<int>v[100005];
inline void DFS(int x,int niv)
{
int i,len;
nivel[x]=niv;
len=v[x].size();
for (i=0;i<len;i++)
DFS(v[x][i],niv+1);
}
inline void ParcurgereEuler(int x)
{
int i,len;
len=v[x].size();
if (len==0) Euler[++lg]=x;
else
{for (i=0;i<len;i++)
{
Euler[++lg]=x;
ParcurgereEuler(v[x][i]);
}
Euler[++lg]=x;}
}
inline void RMQ()
{
int i,aux,put;
mat[lg][0]=Euler[lg];
for (i=lg-1;i>=1;i--)
{
mat[i][0]=min(rmq[i],rmq[i+1]);
aux=lg-i;
put=0;
while (puteri[put]<aux)
{
put++;
mat[i][put]=min(mat[i][put-1],mat[i+puteri[put-1]][put-1]);
if (i==lg-4)
fout<<puteri[put]<<" ";
}
}
}
int main()
{
int i;
fin>>n>>m;
for (i=1;i<=n-1;i++)
{
fin>>a[i];
v[a[i]].push_back(i+1);
}
puteri[0]=1;
for (i=1;i<=22;i++)
puteri[i]=puteri[i-1]<<1;
DFS(1,1);
ParcurgereEuler(1);
for (i=1;i<=lg;i++)
rmq[i]=nivel[Euler[i]];
RMQ();
fout<<"\n";
for (i=1;i<=lg;i++)
{
for (int j=0;j<=20;j++)
fout<<mat[i][j]<<" ";
fout<<"\n";
}
return 0;
}