Pagini recente » Cod sursa (job #2641372) | Cod sursa (job #1611840) | Cod sursa (job #346670) | Cod sursa (job #2437920) | Cod sursa (job #1771956)
# include <fstream>
# include <vector>
# define DIM 100010
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> Lista[DIM];
int m[20][DIM],p2[20],Marcat[DIM],niv[DIM],p[DIM],rp[DIM];
int n,m1,s,i,j,x,d,st,dr,vst,vdr;
void dfs(int nc,int nivc){
niv[nc]=nivc;
s++;
Marcat[nc]=s;
p[s]=nivc;
rp[s]=nc;
for(int i=0;i<Lista[nc].size();i++){
int nv=Lista[nc][i];
if(!Marcat[nv])
dfs(nv,nivc+1);
}
}
int main () {
f>>n>>m1;
p2[0]=1;
for(i=1;2*p2[i-1]<=n;i++)
p2[i]=2*p2[i-1];
d=i-1;
for(i=1;i<n;i++){
f>>x;
Lista[x].push_back(i+1);
}
dfs(1,0);
for(i=1;i<=n;i++){
m[0][i]=rp[i];
g<<m[0][i]<<" ";
}
g<<"\n";
for(i=1;i<=d;i++){
for(j=1;j<=n-p2[i]+1;j++){
st=j;
dr=j+p2[i-1];
vst=m[i-1][st];
vdr=m[i-1][dr];
if(niv[vst]<niv[vdr])
m[i][j]=vst;
else
m[i][j]=vdr;
g<<m[i][j]<<" ";
}
g<<"\n";
}
return 0;
}