<p>You are given a <strong>0-indexed</strong> integer array <code>nums</code> and an integer <code>p</code>. Find <code>p</code> pairs of indices of <code>nums</code> such that the <strong>maximum</strong> difference amongst all the pairs is <strong>minimized</strong>. Also, ensure no index appears more than once amongst the <code>p</code> pairs.</p>

<p>Note that for a pair of elements at the index <code>i</code> and <code>j</code>, the difference of this pair is <code>|nums[i] - nums[j]|</code>, where <code>|x|</code> represents the <strong>absolute</strong> <strong>value</strong> of <code>x</code>.</p>

<p>Return <em>the <strong>minimum</strong> <strong>maximum</strong> difference among all </em><code>p</code> <em>pairs.</em> We define the maximum of an empty set to be zero.</p>

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

<pre>
<strong>Input:</strong> nums = [10,1,2,7,1,3], p = 2
<strong>Output:</strong> 1
<strong>Explanation:</strong> The first pair is formed from the indices 1 and 4, and the second pair is formed from the indices 2 and 5. 
The maximum difference is max(|nums[1] - nums[4]|, |nums[2] - nums[5]|) = max(0, 1) = 1. Therefore, we return 1.
</pre>

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

<pre>
<strong>Input:</strong> nums = [4,2,1,2], p = 1
<strong>Output:</strong> 0
<strong>Explanation:</strong> Let the indices 1 and 3 form a pair. The difference of that pair is |2 - 2| = 0, which is the minimum we can attain.
</pre>

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

<ul>
	<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
	<li><code>0 &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
	<li><code>0 &lt;= p &lt;= (nums.length)/2</code></li>
</ul>

class Solution {
    bool isPoss(int diff,vector<int> &nums,int &p){
        int cnt = 0;
        // if(diff ==0){
        //     for(auto it:mp) cout<<it<<" ";
        //     cout<<"-*\n";
        // }
        // for(auto it= mp.begin();it != mp.end();it++){
        //     int val = *it;
        //     // auto itr1 = it;
        //     // mp.erase(itr1);
        //     auto itr = mp.upper_bound(val+diff);
        //     itr--;
        //     // cout<<*itr<<"--/*\n";
            
        //     if(itr == it) continue;
        //     if(*itr > (val+diff)) continue;
        //     else{
        //         cnt++;
        //         mp.erase(itr);
        //     }
            
        // }
        // if(diff == 0) cout<<cnt<<"***\n";

        for(int i=0;i<nums.size()-1;i++){
            int d  = nums[i+1]-nums[i];
            if(d<=diff){
                cnt++;
                i++;
            }
        }
        return cnt>=p;
    }
public:
    int minimizeMax(vector<int>& nums, int p) {
        int n = nums.size();
        multiset<int> mp;
        sort(nums.begin(),nums.end());
        for(auto it:nums) mp.insert(it);
        int low = 0,high = nums[n-1]-nums[0];
        int ans = 1e9;
        while(low<=high){
            int mid = (low + high)/2;
            // cout<<mid<<"/\n";
            bool r = isPoss(mid,nums,p);
            // cout<<r<<"---\n";
            if(!r) low = mid+1;
            else{
                ans=min(ans,mid);
                high = mid-1;
            }
        }
        return ans;

    }
};
120800