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
| #include <cstdio> #include <cctype> #include <algorithm> #include <cstring> #include <iostream> #include <cassert> #include <cmath> using namespace std; typedef long long ll; template <typename _Tp> void read(_Tp &a, char c = 0, int f = 1) { for(c = getchar(); !isdigit(c); c = getchar()) if(c == '-') f = -1; for(a = 0; isdigit(c); a = a * 10 + c - '0', c = getchar()); a *= f; } template <typename _Tp> void write(_Tp a) { if(a < 0) putchar('-'), a = -a; if(a > 9) write(a / 10); putchar(a % 10 + '0'); }
const int N = 1e5 + 5;
ll n, k, m; ll a[N], b[N], c[N];
bool check(ll q) { for(int i = 1; i <= n; i++) { if(q <= b[i]) c[i] = 1; else c[i] = 0; } int cnt = 0; ll s = 0; int l = 1, r = 1; for(; l <= n; l++) { while(cnt < k && r <= n) { if(c[r]) { cnt++; } r++; } if(cnt < k) break; s += n - r + 2; if(c[l]) cnt--; } if(s >= m) return 1; else return 0; }
int main() { int T; read(T); while(T--) { read(n), read(k), read(m); for(int i = 1; i <= n; i++) { read(a[i]); b[i] = a[i]; } sort(a + 1, a + n + 1); int _n = unique(a + 1, a + n + 1) - a - 1; int L = 1, R = _n, ans = -1; while(L <= R) { int mid = (L + R) / 2; if(check(a[mid])) ans = mid, L = mid + 1; else R = mid - 1; } write(a[ans]), putchar('\n'); } return 0; }
|