<p>You are given two integers <code>n</code> and <code>k</code> and two integer arrays <code>speed</code> and <code>efficiency</code> both of length <code>n</code>. There are <code>n</code> engineers numbered from <code>1</code> to <code>n</code>. <code>speed[i]</code> and <code>efficiency[i]</code> represent the speed and efficiency of the <code>i<sup>th</sup></code> engineer respectively.</p>

<p>Choose <strong>at most</strong> <code>k</code> different engineers out of the <code>n</code> engineers to form a team with the maximum <strong>performance</strong>.</p>

<p>The performance of a team is the sum of its engineers&#39; speeds multiplied by the minimum efficiency among its engineers.</p>

<p>Return <em>the maximum performance of this team</em>. Since the answer can be a huge number, return it <strong>modulo</strong> <code>10<sup>9</sup> + 7</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2
<strong>Output:</strong> 60
<strong>Explanation:</strong> 
We have the maximum performance of the team by selecting engineer 2 (with speed=10 and efficiency=4) and engineer 5 (with speed=5 and efficiency=7). That is, performance = (10 + 5) * min(4, 7) = 60.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3
<strong>Output:</strong> 68
<strong>Explanation:
</strong>This is the same example as the first but k = 3. We can select engineer 1, engineer 2 and engineer 5 to get the maximum performance of the team. That is, performance = (2 + 10 + 5) * min(5, 4, 7) = 68.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4
<strong>Output:</strong> 72
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= k &lt;= n &lt;= 10<sup>5</sup></code></li>
	<li><code>speed.length == n</code></li>
	<li><code>efficiency.length == n</code></li>
	<li><code>1 &lt;= speed[i] &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= efficiency[i] &lt;= 10<sup>8</sup></code></li>
</ul>

class Solution {
public:
    static bool cmp(pair<int, int>& a, pair<int, int>& b) {
        return (a.first > b.first);
    }

    int maxPerformance(int n, vector<int>& speed, vector<int>& eff, int k) {
        vector<pair<int, int>> vp;
        for (int i = 0; i < n; i++) {
            vp.push_back({eff[i], speed[i]});
        }
        sort(vp.begin(), vp.end(), cmp);
        // for (auto c : vp) {
        //     cout << c.first << ' ' << c.second << endl;
        // }
        priority_queue<pair<int, int>, vector<pair<int, int>>,
                       greater<pair<int, int>>>
            pq; // it stores till index {sum , min value}
        long long sum = 0, mini = 1e9, ans = 0 , mod = 1e9+7;
        for (int i = 0; i < n; i++) {
            sum += vp[i].second;
            mini = vp[i].first;
            pq.push({vp[i].second, vp[i].first});
            // if pq size <= k then we simply iterate otherwise we pop untill
            // size > k
            while (pq.size() > k) {
                int minVal = pq.top().first;
                pq.pop();
                sum -= minVal;
                // we don't need to update mini value because it is already in
                // sorted order
            }
            ans = max(ans, (sum * mini));
        }
        return ans%mod;
        // sort(speed.begin(), speed.end(), greater<int>());
        // sort(eff.begin(), eff.end(), greater<int>());
        // for (auto c : speed)
        //     cout << c << ' ';
        // cout << endl;
        // for (auto c : eff)
        //     cout << c << ' ';
        // cout << endl;
        // for (int i = 0; i < k; i++) {
        //     int whichMax =
        //         max(speed[i] * maxSpeed[speed[i]], eff[i] * maxEff[eff[i]]);
        //     // cout<<mini<<' ';
        //     int mini1 = 0;
        //     if (whichMax == speed[i] * maxSpeed[speed[i]]) {
        //         mini1 = maxSpeed[speed[i]];
        //     } else {
        //         mini1 = maxEff[eff[i]];
        //     }
        //     if (!vis[mini1]) {
        //         ans += max(speed[i] * maxSpeed[speed[i]], eff[i] *
        //         maxEff[eff[i]]);
        //     }
        // }
        // cout << endl;
        // return ans;
    }
};
41603