#include <bits/stdc++.h>
using namespace std;
const int nmax = 150010;
struct tree {
  long long sum, pref, suf, best;
  int L, R;
};
tree operator+(tree l, tree r) {
  tree temp;
  temp.pref = max(l.pref, l.sum + r.pref);
  temp.suf = max(r.suf, r.sum + l.suf);
  temp.sum = l.sum + r.sum;
  temp.best = max(l.best, max(r.best, l.suf + r.pref));
  return temp;
}
tree T[4 * nmax];
int n, m, c;
int p[nmax], d[nmax], arr[nmax];
void build(int l, int r, int z) {
  T[z].L = l;
  T[z].R = r;
  if (l == r) {
    T[z].pref = max((long long)arr[l], 0LL);
    T[z].suf = T[z].pref;
    T[z].best = T[z].suf;
    T[z].sum = arr[l];
  } else {
    build(l, (l + r) / 2, z * 2);
    build((l + r) / 2 + 1, r, z * 2 + 1);
    T[z].pref =
        max(T[z].pref, max(T[z * 2].pref, T[z * 2].sum + T[2 * z + 1].pref));
    T[z].suf = max(T[2 * z + 1].suf, T[2 * z + 1].sum + T[z * 2].suf);
    T[z].sum = T[2 * z].sum + T[2 * z + 1].sum;
    T[z].best = max(T[2 * z].best,
                    max(T[2 * z + 1].best, T[2 * z].suf + T[2 * z + 1].pref));
  }
}
tree get(int l, int r, int z) {
  int c = (T[z].L + T[z].R) / 2;
  if (T[z].L == l && T[z].R == r) return T[z];
  if (r <= c) return get(l, r, 2 * z);
  if (l > c) return get(l, r, 2 * z + 1);
  return get(l, c, 2 * z) + get(c + 1, r, 2 * z + 1);
}
int main() {
  scanf("%d %d %d", &n, &m, &c);
  int cur, x;
  scanf("%d", &cur);
  for (int i = 1; i < n; i++) {
    scanf("%d", &x);
    d[i] = x - cur;
    cur = x;
  }
  for (int i = 1; i < n; i++) scanf("%d", &p[i]);
  for (int i = 1; i < n; i++) arr[i] = d[i] * 50 - p[i] * c;
  build(1, n, 1);
  long long ans = 0LL;
  for (int i = 0; i < m; i++) {
    scanf("%d %d", &cur, &x);
    x--;
    ans += max(get(cur, x, 1).best, 0LL);
  }
  cout << ans / 100 << '.' << ans % 100 << endl;
  return 0;
}
