Pagini recente » Cod sursa (job #501323) | Cod sursa (job #638169) | Cod sursa (job #856716) | Cod sursa (job #1726407) | Cod sursa (job #2146505)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("farfurii.in");
ofstream fout("farfurii.out");
const int NMax=15005;
class SegmentTree
{
public:SegmentTree(int size)
{
N=size;
int lg=ceil(log2(N));
ST.resize(1<<lg+1);
}
public:void Insert(long long index)
{
Insert(index,1,1,N);
}
public:void Query(long long index)
{
Query(1,index,1,N);
}
private:int N;
private:vector<long long> ST;
private:void Insert(long long index,long long node,long long left,long long right)
{
if(left==right)
{
ST[node]=1;
return;
}
long long middle=(left+right)/2;
Insert(index,2*node,left,middle);
Insert(index,2*node+1,middle+1,right);
ST[node]+=ST[2*node]+ST[2*node+1];
}
private:void Query(long long node,long long index,long long left, long long right)
{
if(left==right)
{
ST[node]=0;
fout<<left<<" ";
return;
}
long long middle=(left+right)/2;
if(index<=ST[2*node])
Query(2*node,index,left,middle);
else
Query(2*node+1,index-ST[2*node],middle+1,right);
ST[node]=ST[2*node]+ST[2*node+1];
}
};
long long N,K;
int main()
{
fin>>N>>K;
SegmentTree segmentTree(N);
segmentTree.Insert(1);
for(long long i=N-1;i>=0;i--)
if(K<=i*(i-1)/2)
segmentTree.Query(1);
else
segmentTree.Query(K-i*(i-1)/2+1), K=i*(i-1)/2;
return 0;
}