#include <bits/stdc++.h>
using namespace std;
struct segment {
  long long prefix, suffix, optimal, total;
};
const int N = (int)1 << 18;
segment rsq[2 * N];
long long value[N];
int p[N], x[N], n, m, c, u, v;
segment operator+(segment a, segment b) {
  segment c;
  c.prefix = max(a.prefix, a.total + b.prefix);
  c.suffix = max(a.suffix + b.total, b.suffix);
  c.optimal = max(max(a.optimal, b.optimal), a.suffix + b.prefix);
  c.total = a.total + b.total;
  return c;
}
void init(int t, int l, int r) {
  if (l == r) {
    rsq[t].prefix = rsq[t].suffix = rsq[t].optimal = max(0ll, value[l]);
    rsq[t].total = value[l];
    return;
  }
  int q = (l + r) / 2;
  init(t * 2 + 1, l, q);
  init(t * 2 + 2, q + 1, r);
  rsq[t] = rsq[t * 2 + 1] + rsq[t * 2 + 2];
}
segment get(int t, int l, int r, int x, int y) {
  if ((r < x) || (y < l)) return segment();
  if ((x <= l) && (r <= y)) return rsq[t];
  int q = (l + r) / 2;
  return get(t * 2 + 1, l, q, x, y) + get(t * 2 + 2, q + 1, r, x, y);
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 0; i < n; ++i) scanf("%d", &x[i]);
  --n;
  for (int i = 0; i < n; ++i) scanf("%d", &p[i]);
  for (int i = 0; i < n; ++i) value[i] = (x[i + 1] - x[i]) * 50ll - c * p[i];
  init(0, 0, N - 1);
  long long res = 0;
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", &u, &v), --u, --v, --v;
    res += get(0, 0, N - 1, u, v).optimal;
  }
  printf("%.10lf\n", res / 100.0);
  return 0;
}
