| 12
 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
 74
 75
 76
 77
 
 | #include <iostream>#include <cstdio>
 #include <algorithm>
 #include <cstring>
 #include <queue>
 #include <climits>
 using namespace std;
 typedef pair<int, int> P;
 const int MAXC = 100010;
 const int MAXN = 20005;
 int N, C, F;
 P cows[MAXC];
 priority_queue<int, vector<int>, less<int> >que;
 priority_queue<int, vector<int>, less<int> >que2;
 int rightMin[MAXC];
 int leftMin[MAXC];
 
 void solve() {
 int ans = 0;
 memset(rightMin, 0, sizeof(rightMin));
 memset(leftMin, 0, sizeof(leftMin));
 int num = N >> 1;
 int totalSum = 0;
 for(int i = 0;i < C; i++) {
 if(ans <= num) {
 que.push(cows[i].second);
 ans++;
 totalSum += cows[i].second;
 rightMin[i] = totalSum;
 continue;
 }
 rightMin[i] = totalSum - que.top() + cows[i].second;
 if(cows[i].second < que.top()) {
 totalSum -= que.top();
 que.pop();
 que.push(cows[i].second);
 totalSum += cows[i].second;
 }
 }
 totalSum = 0;
 ans = 0;
 for(int i = C - 1; i >= 0; i--) {
 if(ans <= num) {
 que2.push(cows[i].second);
 ans++;
 totalSum += cows[i].second;
 leftMin[i] = totalSum;
 continue;
 }
 leftMin[i] = totalSum - que2.top() + cows[i].second;
 if(cows[i].second < que2.top()) {
 totalSum -= que2.top();
 que2.pop();
 que2.push(cows[i].second);
 totalSum += cows[i].second;
 }
 }
 int CSAT = 0;
 for(int i = num; i < C - num; i++) {
 if(rightMin[i] + leftMin[i] - cows[i].second <= F) {
 CSAT = cows[i].first;
 printf("%d\n", CSAT);
 return ;
 }
 }
 printf("-1\n");
 }
 
 int main(){
 while(scanf("%d%d%d", &N, &C, &F) != EOF) {
 for(int i = 0; i < C; i++) {
 scanf("%d%d", &cows[i].first, &cows[i].second);
 }
 sort(cows, cows + C, greater<P>());
 solve();
 }
 }
 
 |