Пример #1
0
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("");
}
Пример #2
0
inline int _query(int p) {
	return bit_query(B, p) + bit_query2(C, p) * p;
}