#include using namespace std; typedef long long ll; // Only prints 1:s. vector A; int n,m; ll k; vector bigger; bool comp(int i, int j){ return A[i] < A[j]; } int score(vector &P){ ll res = 0; for(int c1 = 0; c1 < n; c1++){ if(res*ll(m) <= ll(c1)*ll(A[P[c1]]))res++; } return res; } void get_p(vector &from, vector &to, ll swaps){ int r = 0; for(int c1 = 0; c1 < n; c1++){ if(bigger[c1] >= swaps){ r = c1; break; } else{ swaps -= bigger[c1]; } } for(int c1 = r; c1 < n; c1++){ to[c1-r] = from[c1]; } for(int c1 = r-1; c1 >= 0; c1--){ to[n-c1-1] = from[c1]; } int r2 = 0; while(r2 < n && A[to[r2]] == A[to[0]]){ r2++; } r2--; for(int c1 = 0; c1 < swaps; c1++){ swap(to[r2], to[r2+1]); r2++; } return; } int main() { cin >> n >> m >> k; vector ind, ind2; for(int c1 = 0; c1 < n; c1++){ int a; cin >> a; A.push_back(a); ind.push_back(c1); ind2.push_back(c1); } if(k%m != 0){ cout << "impossible\n"; return 0; } k /= m; sort(ind.begin(), ind.end(), comp); int ma = score(ind); reverse(ind.begin(), ind.end()); int mi = score(ind); if(k > ma || k < mi){ cout << "impossible\n"; return 0; } int same = 0; ll inversions = 0; for(int c1 = n-1; c1 >= 0; c1--){ inversions += (n-1-c1)-same; bigger.push_back((n-1-c1)-same); if(c1 > 0 && A[ind[c1-1]] == A[ind[c1]]){ same++; } else{ same = 0; } } reverse(bigger.begin(), bigger.end()); ll l = 0; ll r = inversions+1; while(l < r-1){ ll mid = (l+r)/2; get_p(ind, ind2, mid); ll temp = score(ind2); if(temp <= k){ l = mid; } else{ r = mid; } } get_p(ind, ind2, l); assert(score(ind2) == k); for(int c1 = 0; c1 < n; c1++){ cout << 1 << " "; } cout << "\n"; return 0; }