#include <bits/stdc++.h>
#define int long long
using namespace std;
int cnt[1000001];
vector<pair<int, int>> luu[1000001];
signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n, k;
	cin >> n >> k;
	vector<vector<int>> r(n+1, vector<int>(k+1)), u(n+1, vector<int>(k+1));
	for (int i = 1;i<=n;++i){
		for (int j = 1;j<=k;++j){
			cin >> r[i][j];
			if(r[i][j]==0)cnt[i]++;
			else luu[j].push_back({r[i][j], i});
		}
	}
	for (int i = 1;i<=k;++i){
		sort(luu[i].begin(), luu[i].end(), [](pair<int, int> p, pair<int, int> q){
			return p>q;
		});
	}
	for (int i = 1;i<=n;++i){
		for (int j = 1;j<=k;++j){
			cin >> u[i][j];
		}
	}
	using state = pair<int, int>;
	priority_queue<state> pq;
	for (int i = 1;i<=n;++i){
		pq.push({cnt[i], i});
		// cout << cnt[i] << ' ' << i << '\n';
	}
	// cout << '\n';
	vector<int> p(k+1, 0);
	int res = 0;
	while(!pq.empty()){
		auto [d, i] = pq.top();
		pq.pop();
		if(d!=cnt[i])continue;
		// cout << d << ' ' << i << '\n';
		if(d!=k){
			cout <<res;
			return 0;
		}else{
			for (int j = 1;j<=k;++j){
				p[j] += u[i][j];
				while(!luu[j].empty()){
					auto [x, y] = luu[j].back();
					if(p[j] >= x){
						cnt[y]++;
						pq.push({cnt[y], y});
						luu[j].pop_back();
					}else break;
				}
			}
			res++;
		}
	}
	cout << res;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |