rt.
#include<bits/stdc++.h>
typedef int IT;
typedef long long LL;
typedef __int128 int128;
typedef double DB;
typedef long double LD;
typedef unsigned int UI;
typedef unsigned long long ULL;
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define frt front
#define bk back
#define tp top
#define fst first
#define sec second
#define psh push
#define mkp make_pair
#define PII pair<IT,IT>
#define PLI pair<LL,IT>
#define lowbit(x) ((x)&(-x))
#define double long double
#define int long long
using namespace std;
const int N=3000,M=3000,Q=1e5+10,R=Q;
int n,m,lks,r,k;
int d[N][M];
struct node{
int opt;
double tm;
int x,y;
bool operator<(const node& p) const{
return tm>p.tm;
}
};
priority_queue<node>q;
int ans;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
bool check_die(int x,int y){
for(int i=0;i<4;i++){
int p=x+dx[i],q=y+dy[i];
if(p<1||p>n||q<1||q>m) continue;
if(d[p][q]) return 0;
}
return 1;
}
bool check_nwtree(int x,int y){
bool f1=0,f2=0;
for(int i=0;i<4;i++){
int p=x+dx[i],q=y+dy[i];
if(p<1||p>n||q<1||q>m) continue;
if(d[p][q]==1) f1=1;
else if(d[p][q]==2) f2=1;
}
return f1&&f2;
}
void solve(){
scanf("%lld%lld%lld%lld%lld",&n,&m,&lks,&r,&k);
for(int i=1;i<=lks;i++){
int x,y,p,q;
scanf("%lld%lld%lld%lld",&x,&y,&p,&q);
for(int j=x;j<=p;j++)
for(int k=y;k<=q;k++)
d[j][k]=1;
}
for(int i=1;i<=r;i++){
int t,x,y;
scanf("%lld%lld%lld",&t,&x,&y);
q.psh({1,(DB)t*1.0,x,y});
}
while(!q.empty()){
node tp=q.top();
q.pop();
double nt=tp.tm;
int nx=tp.x,ny=tp.y;
if(tp.opt==1){
if(!d[nx][ny]){
d[nx][ny]=2;
if(check_die(nx,ny))
q.psh({0,nt+k+0.5,nx,ny});
for(int i=0;i<4;i++){
int px=nx+dx[i],py=ny+dy[i];
if(px<1||px>n||py<1||py>m) continue;
if(check_nwtree(px,py))
q.psh({1,nt+1,px,py});
}
}
}
else{
if(check_die(nx,ny))
d[nx][ny]=0;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(d[i][j]==2) ans++;
printf("%lld\n",ans);
return;
}
signed main(){
// freopen("lake4.in","r",stdin);
// freopen("lake.out","w",stdout);
int T=1;
// scanf("%lld",&T);
while(T--){
solve();
}
return 0;
}