Cod sursa(job #2668181)

Utilizator alexandrubunea03Bunea Alexandru alexandrubunea03 Data 4 noiembrie 2020 16:53:05
Problema Statistici de ordine Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>
using namespace std;
#define NMax 3000000

int n, k, x, max_num = INT_MIN, aib[NMax + 1];

void update(int pos);
int query(int pos);

int main() {
  freopen("sdo.in", "r", stdin);
  freopen("sdo.out", "w", stdout);
  ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  cin >> n >> k;
  for(int i = 1; i <= n; ++i) {
    cin >> x;
    max_num = max(max_num, x);
    update(x);
  }
  int left = 0, right = max_num, middle = 1, result = 1;
  while(left <= right) {
    middle = (left + right) >> 1;
    if(query(middle) >= k) result = middle, right = middle - 1;
    else left = middle + 1;
  }
  cout << result;
  return 0;
}

void update(int pos) {
  for(int i = pos; i <= NMax; i += i & -i) ++aib[i];
}
int query(int pos) {
  int sum = 0;
  for(int i = pos; i; i -= i & -i) {
    sum += aib[i];
    if(sum > k) return sum;
  }
  return sum;
}