#include using namespace std; #define int long long #define ALL(a) a.begin(),a.end() #define rep(i,n) for (int i = 0; i < n; i++) #define rep1(i,n) for(int i=1;i<=(n);i++) #define rrep(i,n) for(int i=(n)-1;i>=0;i--) #define rrep1(i, n) for (int i = (n); i > 0; i--) #define REP(i, a, b) for (int i = a; i < b; i++) template ostream& operator << (ostream &s, vector &P) { for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; } template bool chmax(T &a, T b){if (a < b){a = b;return true;}return false;} template bool chmin(T &a, T b){if (a > b){a = b;return true;}return false;} using P = pair; const int inf = 1e18; template int count_smaller_than(vector & V,T x){ auto itr = lower_bound(V.begin(),V.end(),x); return itr - V.begin(); } template int smaller_than(vector & V,T x){ auto itr = lower_bound(V.begin(),V.end(),x); if (itr == V.begin()){return -inf;} return V[itr - V.begin() - 1]; } template vector push(vector & V){ vector> A; vector res(V.size()); for (int i = 0; i < V.size(); i++){ A.push_back(P{V[i],i}); } sort(A.begin(),A.end()); T saved_val; int prev_idx = 1; for (int i = 0; i < V.size(); i++){ auto [val,idx] = A[i]; if (i == 0){res[idx] = 1;saved_val = val;prev_idx = 1;continue;} if (saved_val == val){res[idx] =prev_idx;continue;} else{saved_val = val;prev_idx++;res[idx] = prev_idx;continue;} } return res; } template T gcd(T a, T b){return (b == 0) ? a : gcd(b, a % b);} template T lcm(T a, T b){return a / gcd(a, b) * b;} templateT powMod(T x, T k, T m) {if (k == 0){return (T)1;}if (k % 2 == 0) {return powMod(x*x % m, k/2, m);}else{return x*powMod(x, k-1, m) % m;}} template T extgcd(T a,T b,T &x,T &y){T g = a;x = 1;y = 0;if (b != 0) {g = extgcd(b, a % b, y, x), y -= (a / b) * x;}return g;} template T invMod(T a,T m){T x,y;if (extgcd(a, m, x, y) == 1) {return (x + m) % m;}else{return -1;}} const int MAXN = 2010; vector> C(MAXN,vector(MAXN,0)); int field_damamge_sum(int rl,int rr,int cl,int cr){ return C[rr][cr] + C[rl - 1][cl - 1] - C[rl - 1][cr] - C[rr][cl - 1]; } void bomb_update(int rl,int rr,int cl,int cr,int d){ C[rl][cl] += d; C[rl][cr + 1] -= d; C[rr + 1][cl] -= d; C[rr + 1][cr + 1] += d; return; } using slime = tuple; signed main(){ int h,w,n,m; cin>>h>>w>>n>>m; vector Slimes; rep(i,n){ int a,b,c,d,e; cin>>a>>b>>c>>d>>e; auto s = slime{a,b,c,d,e}; Slimes.push_back(s); } rep(i,m){ int x,y,b,c; cin>>x>>y>>b>>c; int rl = max(1ll,x - b); int rr = min(h,x + b); int cl = max(1ll,y - b); int cr = min(w,y + b); bomb_update(rl,rr,cl,cr,c); } rep1(i,h)rep1(j,w){ int x = C[i][j]; C[i][j + 1] += x; } rep1(i,h)rep1(j,w){ int x = C[i][j]; C[i + 1][j] += x; } rep1(i,h)rep1(j,w){ int x = C[i][j]; C[i][j + 1] += x; } rep1(i,h)rep1(j,w){ int x = C[i][j]; C[i + 1][j] += x; } int ans = 0; for (auto s : Slimes){ auto [rl,rr,cl,cr,h] = s; //cout << field_damamge_sum(rl,rr,cl,cr) << endl; if (field_damamge_sum(rl,rr,cl,cr) < h)ans++; } cout << ans << endl; return 0; }