Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=1e6+7;
- int n;
- ll m;
- int a[N];
- int b[N];
- int siz[N<<2];
- #define ls (rt<<1)
- #define rs (rt<<1|1)
- void insert(int rt,int l,int r,int x){
- siz[rt]++;
- if(l==r)return ;
- int mid=(l+r)>>1;
- if(x<=mid)insert(ls,l,mid,x);
- else insert(rs,mid+1,r,x);
- }
- int query(int rt,int l,int r,int x){
- if(r<=x)return siz[rt];
- int mid=(l+r)>>1;
- if(x<=mid)return query(ls,l,mid,x);
- else return query(ls,l,mid,x)+query(rs,mid+1,r,x);
- }
- int kth(int rt,int l,int r,int x){
- if(l==r)return l;
- int mid=(l+r)>>1;
- if(x<=siz[ls])return kth(ls,l,mid,x);
- else return kth(rs,mid+1,r,x-siz[ls]);
- }
- inline void work(int k,int x){
- for(int i=1;i<=n;++i){
- if(i<=k)b[i]=i;
- else if(query(1,1,n,a[i])>=k)b[i]=a[i];
- else b[i]=kth(1,1,n,k);
- insert(1,1,n,a[i]);
- }
- for(int i=k+2;i<=n;++i){
- if(b[i]<b[k+1])swap(b[k+1],b[i]);
- if(!--x)break;
- }
- for(int i=1;i<=n;++i){
- printf("%d ",b[i]);
- }
- exit(0);
- }
- int main(){
- freopen("sort.in","r",stdin);
- freopen("sort.out","w",stdout);
- r(n),r(m);
- for(int i=1;i<=n;++i){
- r(a[i]);
- }
- for(int i=1;i<=n;++i){
- if(m>n-i)m-=n-i;
- else work(i-1,m);
- }
- for(int i=1;i<=n;++i){
- printf("%d ",i);
- }
- }
- /*
- 9
- 36
- 1 9 8 2 3 7 5 4 6
- */
Add Comment
Please, Sign In to add comment