#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <cmath>
#define pb push_back
#define snd second
#define fst first
#define forn(i,n) for(int i=0;i<n;++i)
#define forsn(i,s,n) for(int i=s; i<n; ++i)
#define all(x) x.begin(), x.end()
#define imp(x) for(auto __:x)cout<<__<<" "; cout<<endl;
#define sz(c) int((c).size())
#define mset(a,v) memset((a), (v), sizeof(a));
using namespace std;
typedef long long ll;
typedef pair<ll, ll> ii;
typedef vector<ll> vi;
int main(){	
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n,k;cin>>n>>k;
	vector<vi> r(n, vi(k)), u(n, vi(k));
	forn(i,n)forn(j,k)cin>>r[i][j];
	forn(i,n)forn(j,k)cin>>u[i][j];
	vi p(k,0), cnt(n, 0);
	vector<vector<ii>> v(k);
	forn(j,k)forn(i,n)v[j].pb({r[i][j], i});
	forn(j,k)sort(all(v[j]), [](auto f, auto s){
		return f.fst<s.fst;
	});
	//~ cout<<"PASS"<<endl;
	vi last(k,0);
	forn(j,k){
		while(last[j]<n&&v[j][last[j]].fst<=p[j]){
			cnt[v[j][last[j]].snd]++;
			last[j]++;
		}
	}
	int ans=0;
	set<int> q;
	forn(i,n)if(cnt[i]==k)q.insert(i);
	while(!q.empty()){
		int i=*q.begin();
		q.erase(q.begin());
		ans++;
		forn(j,k)p[j]+=u[i][j];
		forn(j,k){
			while(last[j]<n&&v[j][last[j]].fst<=p[j]){
				cnt[v[j][last[j]].snd]++;
				if(cnt[v[j][last[j]].snd]==k){
					q.insert(v[j][last[j]].snd);
				}
				last[j]++;
			}
		}
	}
	cout<<ans<<endl;
}
| # | 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... |