#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
cin.tie(0)->sync_with_stdio(0);
int n, k, ans=0;
cin >> n >> k;
vector<pair<vector<int>, vector<int>>> modreq;
set<int> s;
vector<int> stat(n+2, 0), cur(k+2, 0);
vector<priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>> upd;
upd.assign(k+2, priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>());
for(int i=0; i<n; i++) {
vector<int> v;
s.insert(i);
for(int j=1; j<=k; j++) {
int in;
cin >> in;
if(j == 1) upd[0].push({in, i});
v.push_back(in);
}
modreq.push_back({v, {}});
}
for(int i=0; i<n; i++) {
vector<int> v;
for(int j=1; j<=k; j++) {
int in;
cin >> in;
v.push_back(in);
}
modreq[i].second = v;
}
queue<int> ord;
for(int i=0; i<k; i++) {
while(!upd[i].empty()) {
auto [req, idx] = upd[i].top();
if(cur[i] >= req) {
upd[i].pop();
if(i+1 == k) {
upd[i+1].push({0, idx});
ord.push(idx);
} else upd[i+1].push({modreq[idx].first[i+1], idx});
} else break;
}
}
while(!ord.empty()) {
int cn = ord.front();
ord.pop();
for(int i=0; i<k; i++) cur[i] += modreq[cn].second[i];
for(int i=0; i<k; i++) {
while(!upd[i].empty()) {
auto [req, idx] = upd[i].top();
if(cur[i] >= req) {
upd[i].pop();
if(i+1 == k) {
upd[i+1].push({0, idx});
ord.push(idx);
} else upd[i+1].push({modreq[idx].first[i+1], idx});
} else break;
}
}
}
cout << upd[k].size();
}