CSES - Shared codeLink to this code:
https://cses.fi/paste/179d02bb2f13c8de44491c/
#include<bits/stdc++.h>
using namespace std;
long long bit[200005],n;
long long ask(long long p)
{
long long sm=0;
while(p>0)
{
sm+=bit[p];
p-=(p&-p);
}
return sm;
}
void update(long long p,int pp)
{
while(p<=n)
{
bit[p]+=pp;
p+=(p&-p);
}
}
long long query(long long l,long long r)
{
return ask(r)-ask(l-1);
}
int main()
{
long long k,i,j,p,ind=0,curk;
cin>>n>>k;
k++;
for(i=1; i<=n; i++)
{
update(i,1);
}
vector<long long>v;
long long nn=n;
while(v.size()<n)
{
curk=k%nn;
if(curk==0)
{
curk=nn;
}
long long can=query(ind+1,n);
if(can<curk)
{
curk-=can;
ind=0;
}
long long l,r,mid,ans;
l=ind+1,r=n;
while(l<=r)
{
mid=(l+r)/2;
long long aa=query(ind+1,mid);
if(aa<curk)
{
l=mid+1;
}
else
{
ans=mid;
r=mid-1;
}
}
v.push_back(ans);
ind=ans;
update(ans,-1);
if(ind==n)ind=0;
nn--;
}
for(auto t:v)cout<<t<<" ";
}