class Solution {
public:
    int largestValsFromLabels(vector<int>& values, vector<int>& labels, int num_wanted, int use_limit) {
        vector<long long int>result;
        map<int,vector<int>>mp;
        for(int i = 0; i < labels.size(); i++){
            mp[labels[i]].push_back(values[i]);
        }
        for(auto i:mp){
            vector<int>v;
            for(auto j:i.second)    v.push_back(j);
            sort(v.begin(), v.end(), greater<int>());
            for(int j = 0; j < min((int)v.size(), use_limit); j++)
                result.push_back(v[j]);
        }
    
        
        sort(result.begin(), result.end(), greater<int>());
    
        int ans = 0;
        for(int i = 0; i < min(num_wanted, (int)result.size()); i++) ans += result[i];
        return ans;
    }
};