#include <bits/stdc++.h>
double const PI = 4 * atan(1.0);
using namespace std;
int n, m, c, x[300111], p[300111], u, v;
long long f[300111], kq = 0, t, a[300111];
struct tree {
  long long m, M, gt;
  tree(){};
  tree(long long _m, long long _M, long long _gt) { m = _m, M = _M, gt = _gt; }
};
tree T[300111 * 4];
tree empty = tree(1ll << 60, -1ll << 60, -1ll << 60);
tree merge(tree T1, tree T2) {
  tree res = tree(min(T1.m, T2.m), max(T1.M, T2.M),
                  max(T1.gt, max(T2.gt, max(T2.M - T1.m, 0ll))));
  return res;
}
void init(int l, int r, int i) {
  if (l == r) {
    T[i].m = min(a[l], a[l - 1]);
    T[i].M = a[l];
    T[i].gt = max(a[l] - a[l - 1], 0ll);
    return;
  }
  int mid = (l + r) / 2;
  init(l, mid, i + i);
  init(mid + 1, r, i + i + 1);
  T[i] = merge(T[i + i], T[i + i + 1]);
}
tree get(int l, int r, int i) {
  if (u > r || v < l) return empty;
  if (u <= l && r <= v) {
    return T[i];
  }
  int mid = (l + r) / 2;
  tree res = merge(get(l, mid, i + i), get(mid + 1, r, i + i + 1));
  return res;
}
int main() {
  scanf("%d %d %d", &n, &m, &c);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x[i]);
  }
  a[0] = a[1] = 0;
  for (int i = 1; i < n; i++) {
    scanf("%d", &p[i]);
    t = (long long)(x[i + 1] - x[i]) * (50) - (long long)(p[i]) * (c);
    a[i + 1] = a[i] + t;
  }
  init(1, n, 1);
  for (int i = 0; i < m; i++) {
    scanf("%d %d", &u, &v);
    u++;
    kq += get(1, n, 1).gt;
  }
  printf("%.9lf\n", double(kq) / 100.0);
}
