This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <cstdlib>
#include <set>
#include <functional>
#include <algorithm>
using namespace std;
typedef long long Int;
const int MAXN = 500050;
const Int INFLL = 1001001001001001001LL;
template<typename T> void chmin(T& a, T b) { if (a > b) a = b; }
template<typename T> void chmax(T& a, T b) { if (a < b) a = b; }
int in() { int x; scanf("%d", &x); return x; }
Int lin() { Int x; scanf("%lld", &x); return x; }
struct CHT {
  typedef pair<Int, Int> line;
  struct comp {
    bool operator() (const line& a, const line& b) {
      return a.first != b.first ? a.first > b.first : a.second < b.second;
    }
  };
  set<line, comp> lines;
  CHT() {
    lines.emplace(INFLL, INFLL);
    lines.emplace(0, INFLL + 1);
  }
  template<typename T> T prev(T it) { --it; return it; }
  template<typename T> T next(T it) { ++it; return it; }
  bool compare(Int a, Int b, Int c, Int d) {  // ab >= cd?
    bool neg1 = (a < 0) ^ (b < 0), neg2 = (c < 0) ^ (d < 0);
    if (neg1 ^ neg2) return neg2;
    if (neg1 && neg2) return compare(abs(c), abs(d), abs(a), abs(b));
    if (a < 0) return compare(-a, -b, -c, -d);
    if (b == 0 || d == 0) return d == 0;
    if (a / d != c / b) return a / d > c / b;
    if (c % b == 0 || a % d == 0) return c % b == 0;
    return compare(b, a % d, d, c % b);
  }
  bool check(line l1, line l2, line l3) {
    return compare(l2.first - l1.first, l3.second - l2.second, l2.second - l1.second, l3.first - l2.first);
  }
  void add(Int a, Int b) {
    line l(a, b);
    auto it = lines.insert(l).first;
    if (check(*prev(it), *it, *next(it))) {
      lines.erase(it);
      return;
    }
    for (--it; it != lines.begin() && check(*prev(it), *it, l); --it) { }
    lines.erase(++it, lines.find(l));
    if (next(lines.find(l)) == lines.end()) {
      return;
    }
    for (it = next(lines.find(l)); next(it) != lines.end() && check(l, *it, *next(it)); ++it) { }
    lines.erase(next(lines.find(l)), it);
  }
  Int value(const line& l, Int x) {
    return l.second >= INFLL ? INFLL : l.first * x + l.second;
  }
  Int query(Int x) {
    lines.erase(lines.begin());
    auto it = lines.begin();
    Int res = value(*it++, x);
    while (it != lines.end()) {
      Int v = value(*it, x);
      if (res > v) {
        res = v;
        lines.erase(lines.begin());
        it = next(lines.begin());
      } else {
        break;
      }
    }
    lines.emplace(INFLL, INFLL);
    return res;
  }
};
Int X, T, W, S[MAXN], dp[MAXN], C[MAXN];
int N, M;
Int off(Int s) {
  return s % T;
}
struct passenger {
  int d, c;
  Int cnt;
} P[MAXN];
int main() {
  X = lin();
  N = in();
  M = in();
  W = lin();
  T = lin();
  for (int i = 0; i < N; ++i) {
    S[i] = lin();
  }
  S[N++] = X;
  for (int i = 1; i <= M; ++i) {
    P[i].d = in();
    P[i].c = in();
    P[i].cnt = X / T + (P[i].d < X % T ? 1 : 0);
  }
  sort(P + 1, P + M + 1, [] (const passenger& a, const passenger& b) {
    return a.d > b.d;
  });
  sort(S, S + N, [] (const Int a, const Int b) {
    return off(a) < off(b);
  });
  C[0] = 0;
  for (int i = 1; i <= M; ++i) {
    C[i] = C[i - 1] + P[i].c;
  }
  CHT cht;
  int last = N;
  Int empty = 0;
  P[0].d = T + 1;
  for (int i = 1; i <= M; ++i) {
    Int min1 = min(empty, (i == 1 ? INFLL : cht.query(i - 1) + C[i - 1]));
    empty = min1 + W * P[i].cnt;
    for (int j = last - 1; j >= 0 && off(S[j]) >= P[i].d; --j) {
      Int b = min1;
      cht.add(W * (S[j] / T), b - W * (S[j] / T) * (i - 1) - C[i - 1]);
      last = j;
    }
  }
  printf("%lld\n", min(empty, cht.query(M) + C[M]) + W * (X / T + (X % T ? 1 : 0)));
  return 0;
}
Compilation message (stderr)
coach.cpp: In function 'int in()':
coach.cpp:16:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 int in() { int x; scanf("%d", &x); return x; }
                                  ^
coach.cpp: In function 'Int lin()':
coach.cpp:17:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 Int lin() { Int x; scanf("%lld", &x); return x; }
                                     ^
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |