Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1e6;
- const int INF = 1e9;
- using pii = pair <int, int>;
- pii ar[N+10]; // value, position
- bool pst[N+10];
- int n, K, P;
- bool compare(pii a, pii b){
- return a.first > b.first;
- }
- bool check(){
- int k = 0, prev = -1;
- for(int i=1;i<=n;i++){
- if(pst[i]){
- if(prev == -1){
- k ++;
- prev = i;
- if(k > K) return false;
- }
- else if(i - prev + 1 == P){
- prev = -1;
- }
- else if(i - prev + 1 > P){
- k ++;
- prev = i;
- if(k > K) return false;
- }
- }
- }
- return true;
- }
- int main(){
- scanf("%d%d%d", &n, &K, &P);
- for(int i=1;i<=n;i++){
- int x;
- scanf("%d", &x);
- ar[i] = {x, i};
- }
- sort(ar+1, ar+n+1, compare);
- int l = 1, r = n, mx = -INF;
- while(l <= r){
- int mid = (l + r) / 2;
- for(int i = 1; i <= n; i ++) pst[i] = false;
- for(int i = 1; i <= mid; i ++) pst[ ar[i].second ] = true;
- if(!check()){
- mx = max(mx, ar[mid].first);
- r = mid - 1;
- }
- else l = mid + 1;
- }
- if(mx == -INF) printf("%d", ar[n].first);
- else printf("%d", mx);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement