#include <bits/stdc++.h>
using namespace std;
const long long Nmax = 2e5 + 5;
struct node {
  long double pre, suf, ans, sum;
} st[4 * Nmax];
long long p[Nmax];
long long x[Nmax];
long long n, m, k;
long double a[Nmax];
long double ans;
node mrg(node l, node r) {
  node res;
  res.ans = max({l.ans, r.ans, l.suf + r.pre});
  res.pre = max(l.pre, l.sum + r.pre);
  res.suf = max(r.suf, l.suf + r.sum);
  res.sum = l.sum + r.sum;
  return res;
}
void build(long long id, long long l, long long r) {
  if (l == r) {
    if (a[l] < 0)
      st[id] = {0, 0, 0, a[l]};
    else
      st[id] = {a[l], a[l], a[r], a[r]};
    return;
  }
  long long mid = (l + r) >> 1;
  build(id * 2, l, mid);
  build(id * 2 + 1, mid + 1, r);
  st[id] = mrg(st[id * 2], st[id * 2 + 1]);
}
node get(long long id, long long l, long long r, long long u, long long v) {
  if (l > v || r < u) return {-1e9, -1e9, -1e9, -1e9};
  if (l >= u && r <= v) return st[id];
  long long mid = (l + r) >> 1;
  node a = get(id * 2, l, mid, u, v);
  node b = get(id * 2 + 1, mid + 1, r, u, v);
  return mrg(a, b);
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> k;
  for (long long i = 1; i <= n; i++) {
    cin >> x[i];
  }
  n--;
  for (long long i = 1; i <= n; i++) {
    cin >> p[i];
  }
  for (long long i = 1; i <= n; i++) {
    a[i] = (x[i + 1] - x[i]) * 0.5 - k * p[i] * 0.01;
  }
  build(1, 1, n);
  for (long long i = 1; i <= m; i++) {
    long long l, r;
    cin >> l >> r;
    ans += get(1, 1, n, l, r - 1).ans;
  }
  cout << fixed << setprecision(6) << ans;
  return 0;
}
