class Solution {
public:
long long maxSpending(vector<vector<int>>& values) {
long long ans=0;
int m=values.size();
int n=values[0].size();
auto cmp=[](const pair<int,pair<int,int>>&a,const pair<int,pair<int,int>>&b){
return a.first>b.first;
};
priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,decltype(cmp)>pq(cmp);
for(int i=0;i<m;i++){
pq.push({values[i][n-1],{i,n-1}});
}
int cnt=1;
while(!pq.empty()){
auto x=pq.top();
pq.pop();
ans+=(long long)cnt*(x.first);
cnt++;
if(x.second.second==0)continue;
pq.push({values[x.second.first][x.second.second-1],{x.second.first,x.second.second-1}});
}
return ans;
}
};