#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)
#define mt make_tuple
#define mp make_pair
#define int long long
#define f first
#define s second
#define pll pair<long long, long long>
#define iii tuple<int,int,int>
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define pb push_back
signed main(){
int x,n,m,w,t;cin>>x>>n>>m>>w>>t;
vector<pll> v;
for(int i=0;i<n;i++){ // refill
int s;
cin>>s;
v.pb({s % t, s/t});
}
n++;
v.pb({x % t, x/t});
int ini=0;
for(int i=0;i<m;i++){
int d,c;cin>>d>>c;
v.pb({d, -c});
ini += (x/t + ((x % t) > d)) * w;
}
ini += (x/t + 1) * w;
//cout<<ini<<endl;
v.pb({-1, -1});
sort(all(v));
//for(auto [a, b] : v)printf(" (%lld,%lld) ", a,b); cout<<endl;
vector<int> dp(n+m+1, 0);
for(int i=1;i<=n+m;i++){
int savings=0, bestr=1e18;
dp[i]=dp[i-1];
if(v[i].s < 0) continue;
for(int j=i;j>=1;j--){
if(v[j].s >= 0) bestr=min(bestr, v[j].s);
else {
savings += (x/t+(x%t>v[j].f) - bestr) * w + v[j].s;
}
//printf("i %lld to j %lld, savings %lld\n", i, j, savings);
dp[i]=max(dp[i], dp[j-1] + savings);
}
}
cout<<ini - dp[n+m];
}