#include <bits/stdc++.h>
using namespace std;
const int maxn = 150005, maxm = 300005;
int x[maxn], n, m;
long long p[maxn], w[maxn], fine, wsum[maxn];
struct Passage {
  int s, e;
  Passage() {}
  Passage(int ss, int ee) {
    s = ss;
    e = ee;
  }
  bool operator<(const Passage cmp) const { return e < cmp.e; }
} psg[maxm];
struct SegmentTree {
  long long mav[maxn << 2], sum[maxn << 2], rnt[maxn << 2];
  long long mm[maxn << 2], mas[maxn << 2];
  bool lazy[maxn << 2];
  void update(int rt, int rtl, int rtr, int l, int r, long long add) {
    if (l <= rtl && r >= rtr) {
      lazy[rt] = true;
      sum[rt] += add;
      mav[rt] = max(mav[rt], sum[rt]);
      rnt[rt] = max(rnt[rt] + add, 0LL);
      mas[rt] = max(mas[rt] + add, 0LL);
      mm[rt] = max(mm[rt], mas[rt]);
      return;
    }
    int mid = (rtl + rtr) >> 1, lson = rt << 1, rson = rt << 1 | 1;
    pushDown(rt, lson, rson);
    if (l <= mid) update(lson, rtl, mid, l, r, add);
    if (r > mid) update(rson, mid + 1, rtr, l, r, add);
    pushUp(rt, lson, rson);
  }
  long long query(int rt, int rtl, int rtr, int l, int r) {
    if (l <= rtl && r >= rtr) {
      return mm[rt];
    }
    int mid = (rtl + rtr) >> 1, lson = rt << 1, rson = rt << 1 | 1;
    pushDown(rt, lson, rson);
    long long ret = 0;
    if (l <= mid) ret = max(ret, query(lson, rtl, mid, l, r));
    if (r > mid) ret = max(ret, query(rson, mid + 1, rtr, l, r));
    return ret;
  }
  void pushDown(int rt, int lson, int rson) {
    if (lazy[rt]) {
      mav[lson] = max(mav[lson], sum[lson] + mav[rt]);
      mav[rson] = max(mav[rson], sum[rson] + mav[rt]);
      sum[lson] += sum[rt];
      sum[rson] += sum[rt];
      rnt[lson] = max(rnt[lson] + sum[rt], rnt[rt]);
      rnt[rson] = max(rnt[rson] + sum[rt], rnt[rt]);
      mm[lson] = max(mm[lson], mas[lson] + mav[rt]);
      mm[rson] = max(mm[rson], mas[rson] + mav[rt]);
      mas[lson] = max(mas[lson] + sum[rt], rnt[rt]);
      mas[rson] = max(mas[rson] + sum[rt], rnt[rt]);
      sum[rt] = mav[rt] = rnt[rt] = 0;
      lazy[rt] = false;
      lazy[lson] = lazy[rson] = true;
    }
  }
  void pushUp(int rt, int lson, int rson) {
    mm[rt] = max(mm[lson], mm[rson]);
    mas[rt] = max(mas[lson], mas[rson]);
  }
} st;
int main() {
  cin >> n >> m >> fine;
  n--;
  for (int i = 0; i <= n; i++) {
    cin >> x[i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> p[i];
  }
  for (int i = 0, s, e; i < m; i++) {
    cin >> s >> e;
    psg[i] = Passage(s, e - 1);
  }
  for (int i = 1; i <= n; i++) {
    w[i] = (long long)(x[i] - x[i - 1]) * 50.0 - p[i] * fine;
  }
  long long res = 0;
  sort(psg, psg + m);
  for (int i = 1, j = 0; i <= n; i++) {
    st.update(1, 1, n, 1, i, w[i]);
    for (; j < m && psg[j].e == i; j++) {
      long long tmp = st.query(1, 1, n, psg[j].s, psg[j].e);
      res += tmp;
    }
  }
  cout << fixed << setprecision(10);
  cout << 0.01 * res << endl;
  return 0;
}
