#include <bits/stdc++.h>
using ll = long long;
using namespace std;
const ll dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
ll a[4030][3030], now[4030][3030];
ll n, m, q, r, k;
bool check(ll x, ll y) {
return x > 0 && x <= n && y > 0 && y <= m;
}
bool grow_tree(ll x, ll y){
bool flag = 0, flag2 = 0;
for(int D=0; D<4; ++D){
int nx = x + dx[D], ny = y + dy[D];
if(check(nx, ny)){
if(a[nx][ny] == -1){
flag = 1;
} if(a[nx][ny] > 0){
flag2 = 1;
}
}
if(flag && flag2){
break;
}
}
return flag && flag2;
}
int main(){
cin >> n >> m >> q >> r >> k;
for(int i=1; i<=q; ++i){
int a1, b1, a2, b2;
cin >> a1 >> b1 >> a2 >> b2;
for(int j=a1; j<=a2; ++j){
for(int p=b1; p<=b2; ++p){
a[j][p] = -1;
}
}
}
queue<pair<ll, pair<ll, ll>>> Q;
for(int i=1; i<=r; ++i){
ll t, x, y;
cin >> t >> x >> y;
a[x][y] = 1;
now[x][y] = t;
Q.push({t, {x, y}});
}
while(Q.size()){
auto cur = Q.front();
Q.pop();
ll t = cur.first, x = cur.second.first, y = cur.second.second;
for(int d=0; d<4 && q; ++d){
ll xx = x + dx[d], yy = y + dy[d];
if(check(xx, yy) && a[xx][yy] == 0){
if(grow_tree(xx, yy)){
a[xx][yy] = 1;
now[xx][yy] = t + 1;
Q.push(make_pair(t+1, make_pair(xx, yy)));
}
}
}
}
ll cnt = 0;
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
if(a[i][j] > 0 && now[i][j]){
bool flag = 1;
for(int d=0; d<4; ++d){
ll xx = i + dx[d], yy = j + dy[d];
if(check(xx, yy) && a[xx][yy] == 1 && now[xx][yy] <= now[i][j] + k){
flag = 0;
break;
}
}
if(flag){
continue;
}
cnt ++;
}
}
}
cout << cnt;
return 0;
}