#include <bits/stdc++.h>
using namespace std;
struct Node {
  long long pref, suff, sum, sub;
  Node() { pref = suff = sum = sub = 0; }
} st[1 << 19];
int n, m, c, x[150005], p[150005];
long long a[150005];
void build(int node, int b, int e) {
  if (b == e) {
    st[node].sum = a[b];
    st[node].pref = st[node].suff = st[node].sub = max(a[b], a[b]);
  } else {
    build(node << 1, b, ((b + e) / 2));
    build(node << 1 | 1, ((b + e) / 2) + 1, e);
    st[node].pref =
        max(st[node << 1].pref, st[node << 1].sum + st[node << 1 | 1].pref);
    st[node].suff =
        max(st[node << 1 | 1].suff, st[node << 1 | 1].sum + st[node << 1].suff);
    st[node].sum = st[node << 1].sum + st[node << 1 | 1].sum;
    st[node].sub = max(st[node << 1].suff + st[node << 1 | 1].pref,
                       max(st[node << 1].sub, st[node << 1 | 1].sub));
  }
}
Node query(int node, int b, int e, int i, int j) {
  if (b > j || e < i) return Node();
  if (b >= i && e <= j) return st[node];
  Node l = query(node << 1, b, ((b + e) / 2), i, j);
  Node r = query(node << 1 | 1, ((b + e) / 2) + 1, e, i, j);
  Node an;
  an.pref = max(l.pref, l.sum + r.pref);
  an.suff = max(r.suff, r.sum + l.suff);
  an.sum = l.sum + r.sum;
  an.sub = max(l.suff + r.pref, max(l.sub, r.sub));
  return an;
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= n; i++) scanf("%d", &x[i]);
  n--;
  for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
  for (int i = 1; i <= n; i++) {
    a[i] = (x[i + 1] - x[i]) * 50ll - 1ll * p[i] * c;
  }
  build(1, 1, n);
  long long an = 0;
  for (int i = 1; i <= m; i++) {
    int l, r;
    scanf("%d %d", &l, &r);
    an += max(0ll, query(1, 1, n, l, r - 1).sub);
  }
  printf("%.10lf", an / 100.0);
  return 0;
}
