#include <bits/stdc++.h>
using namespace std;
const int maxn = 150000;
struct node {
  long long l, r, sm, mx;
} tr[4 * maxn];
inline node comb(node ll, node rr) {
  node ret;
  ret.l = max(ll.l, ll.sm + rr.l);
  ret.r = max(rr.r, rr.sm + ll.r);
  ret.sm = ll.sm + rr.sm;
  ret.mx = max(max(ll.mx, rr.mx), ll.r + rr.l);
  return ret;
}
inline void pushup(int o) { tr[o] = comb(tr[o * 2], tr[o * 2 + 1]); }
long long a[maxn];
void build(int o, int l, int r) {
  if (l == r) {
    tr[o].l = tr[o].r = tr[o].sm = tr[o].mx = a[l];
    return;
  }
  build(o * 2, l, (l + r) / 2);
  build(o * 2 + 1, (l + r) / 2 + 1, r);
  pushup(o);
}
node query(int o, int l, int r, int ql, int qr) {
  if (ql <= l && qr >= r) return tr[o];
  if (qr <= (l + r) / 2) return query(o * 2, l, (l + r) / 2, ql, qr);
  if (ql > (l + r) / 2) return query(o * 2 + 1, (l + r) / 2 + 1, r, ql, qr);
  node ll = query(o * 2, l, (l + r) / 2, ql, qr),
       rr = query(o * 2 + 1, (l + r) / 2 + 1, r, ql, qr);
  return comb(ll, rr);
}
long long b[maxn];
int main() {
  long long n, q, c;
  scanf("%lld%lld%lld", &n, &q, &c);
  long long x;
  scanf("%lld", &x);
  n--;
  for (int i = 1; i <= n; i++) scanf("%lld", b + i);
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &x);
    a[i] = (b[i] - b[i - 1]) * 50 - c * x;
  }
  build(1, 1, n);
  long long ans = 0;
  while (q--) {
    long long l, r;
    scanf("%lld%lld", &l, &r);
    r--;
    node tmp = query(1, 1, n, l, r);
    ans += max(tmp.mx, 0LL);
  }
  cout << fixed << setprecision(9) << 0.01 * ans << endl;
}
