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; }
|