Posted on

## Submission

```class Solution {
public:
vector<int> mostCompetitive(vector<int>& nums, int k) {
int count = nums.size() - k;

stack<int> Stack;

for(int n: nums) {
while(count > 0 && !Stack.empty() && Stack.top() > n) {
// cout << "pop: " << Stack.top() << endl;
Stack.pop();
count--;
}

Stack.push(n);
// cout << "push: " << n << endl;
}

vector<int> rets;

for(int i = 0; i < count; ++i) {
Stack.pop();
}

while(!Stack.empty()) {
rets.push_back(Stack.top());
Stack.pop();
}

reverse(rets.begin(), rets.end());

return rets;
}
};```

## Contest Submission

```class Solution {
public:
vector<int> mostCompetitive(vector<int>& nums, int k) {
stack<pair<int, int>> s;

vector<pair<int, int>> order;
for(int i = 0; i < nums.size(); ++i) {
int num = nums[i];
if(s.empty()) s.push({num, i});
else {
while(!s.empty() && s.top().first > num) {
order.push_back(s.top());
s.pop();
}
s.push({num,i});
}
}

while(!s.empty()) {
order.push_back(s.top());
s.pop();
}

vector<pair<int,int>> ret {order.end() - k, order.end()};
sort(ret.begin(), ret.end(), [](pair<int,int>& a, pair<int,int>& b) {
return a.second < b.second;
});
vector<int> rets;

for(int i = 0; i < ret.size(); ++i) {
rets.push_back(ret[i].first);
}
return rets;
}
};
```