int main() { int N; long long K; scanf("%d %lld", &N, &K); for(int i = 1; i <= N; i++) scanf("%d", &A[i]); build_tree(1, N, 0); for(int i = 1; i <= N; ){ if(bit_query(i, i) == 1){ i++; continue; } int L = i; int R_L = L, R_R = N; while(R_L < R_R) { int mid = (R_L + R_R + 1)/2; if((mid - L) - bit_query(L, mid) <= K) { R_L = mid; } else { R_R = mid - 1; } } int R = R_L; pair it = query(1, N, 0, L, R); int max_val = it.first, max_ind = it.second; if(max_ind == i) { printf("%d ", A[i]); i++; continue; } printf("%d ", max_val); K -= (max_ind - i) - bit_query(i, max_ind); update(1, N, 0, max_ind, INT_MIN/2); bit_update(max_ind, 1); } puts(""); }
inline int _query(int p) { return bit_query(B, p) + bit_query2(C, p) * p; }