Pagini recente » Cod sursa (job #2533767) | Cod sursa (job #2857056) | Cod sursa (job #207715) | Cod sursa (job #3214514) | Cod sursa (job #303630)
Cod sursa(job #303630)
#include <iostream>
#include <algorithm>
#define FIN "planeta.in"
#define FOUT "planeta.out"
#define MAX 70
using namespace std;
int N;
long long K;
struct tree{
int inf;
tree *stanga, *dreapta;
} *T;
int cnt=0;
long long nrpos(int lower,int upper){
if (lower>=upper){return 1;}
long long sum=0;
for (int rad=lower;rad<=upper;++rad){
sum+=nrpos(lower,rad-1)*nrpos(rad+1,upper);
}
return sum;
}
void get(int lower,int upper,long long K,tree *T){
if (lower==upper){T->inf=lower;return ;}
long long sum=0,scurrent;
T->inf=lower;
int ok=1;
long long pstanga,pdreapta;
while (ok){
pstanga=nrpos(lower,T->inf-1);
pdreapta=nrpos(T->inf+1,upper);
scurrent=pstanga*pdreapta;
if (sum+scurrent<K){sum+=scurrent;++T->inf;} else {ok=0;}
}
long long ceva=K-sum;
long long Kstanga=ceva/pdreapta +1;
long long Kdreapta=ceva%pdreapta;
if (Kdreapta==0){--Kstanga; Kdreapta=pdreapta;}
if (T->inf<upper){
T->dreapta=new tree;
T->dreapta->stanga=NULL;
T->dreapta->dreapta=NULL;
}
if (T->inf>lower){
T->stanga=new tree;
T->stanga->stanga=NULL;
T->stanga->dreapta=NULL;
}
if (T->inf>lower) get(lower,T->inf-1,Kstanga,T->stanga);
if (T->inf<upper) get(T->inf+1,upper,Kdreapta,T->dreapta);
}
void afis(tree *T){
++cnt;
if (cnt<N){
printf("%d ",T->inf);
} else {printf("%d\n",T->inf);}
if (T->stanga){ afis (T->stanga);}
if (T->dreapta) { afis (T->dreapta); }
}
void iofile(void){
freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);
scanf("%d%lld",&N,&K);
fclose(stdin);
return ;
}
void solve(void){
T=new tree;
T->stanga=NULL;
T->dreapta=NULL;
get(1,N,K,T);
afis(T);
fclose(stdout);
}
int main(void){
iofile();
solve();
return 0;
}