1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
   | #include<bits/stdc++.h> using namespace std;
  void read(int &x) {     x=0;char c;     while((c=getchar())<'0'||c>'9');     while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); }
  struct seq {     int val,id; }s[200010];int mp[200010],a[200010]; bool operator < (seq x,seq y){return x.val<y.val;}
  int fw[200010]; int n,k; int *tr[200010],buf[200010],*now;
  namespace tarr {     int t[200010];     int lowbit(int x){return x&(-x);}     void insert(int pos)     {         while(pos<=n)++t[pos],pos+=lowbit(pos);     }     int query(int pos)     {         int ret=0;         while(pos)ret+=t[pos],pos-=lowbit(pos);         return ret;     } } namespace treap {     struct tree     {         int ls,rs,pri,siz,tg,v;     }t[200010];int rt;     void upd(int u){t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz+1;}     void newt(int id,int v)     {         t[id].ls=t[id].rs=t[id].tg=0;         t[id].pri=rand(),t[id].siz=1,t[id].v=v;     }     void d(int u)     {         if(t[u].ls)t[t[u].ls].tg+=t[u].tg,t[t[u].ls].v+=t[u].tg;         if(t[u].rs)t[t[u].rs].tg+=t[u].tg,t[t[u].rs].v+=t[u].tg;         t[u].tg=0;     }     void split(int siz,int o,int &u,int &v)     {         if(!o)         {             u=v=0;             return;         }         if(!siz)         {             u=0,v=o;             return;         }         if(siz==t[o].siz)         {             u=o,v=0;             return;         }         d(o);         if(t[t[o].ls].siz>=siz)v=o,split(siz,t[o].ls,u,t[v].ls);         else u=o,split(siz-t[t[o].ls].siz-1,t[o].rs,t[u].rs,v);         upd(o);     }     int merge(int u,int v)     {         if(!u)return v;if(!v)return u;         if(t[u].pri>t[v].pri)         {             d(u);             t[u].rs=merge(t[u].rs,v);             upd(u);             return u;         }         d(v);         t[v].ls=merge(u,t[v].ls);         upd(v);         return v;     }     void init()     {         srand(20070106);rt=1,newt(1,s[n].id);s[n].id=n;         for(int i=2;i<=k;i++)newt(i,n),rt=merge(rt,i);     }     int insert(int pos,int x)     {         int u,v,id,ret;split(k-1,rt,rt,id),         split(pos,rt,u,v);ret=t[id].v-1;         if(v)--t[v].tg,--t[v].v;newt(id,x);         v=merge(id,v);         rt=merge(u,v);         return ret;     } }
  int main() {     freopen("fable.in","r",stdin);freopen("fable.out","w",stdout);     read(n),read(k);     for(int i=1;i<=n;i++)read(s[i].val),s[i].id=i;sort(s+1,s+1+n);     for(int i=1;i<=n;i++)mp[i]=s[i].val,s[i].val=i,a[s[i].id]=i;     for(int i=1;i<=n;i++)fw[i]=i-tarr::query(a[i]-1)-1,tarr::insert(a[i]);     treap::init();     for(int i=n-1;i;i--)     {         if(fw[s[i].id]<k)         {             s[i].id=treap::insert(fw[s[i].id],s[i].id-fw[s[i].id]);             continue;         }         s[i].id-=k;     }     for(int i=1;i<=n;i++)a[s[i].id]=mp[i];     for(int i=1;i<=n;i++)printf("%d\n",a[i]);     return 0; }
   |