#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300 * 1000;
long long x[MAXN], a[MAXN], b[MAXN], cnt_p[MAXN];
long double p[MAXN];
long double sum[MAXN];
struct vertex {
  long double ma, l, r, all;
  vertex(){};
  vertex(long double ma, long double l, long double r, long double all)
      : ma(ma), l(l), r(r), all(all){};
};
long double max(long double a, long double b) { return (a > b) ? a : b; }
class tree {
 public:
  vector<vertex> t;
  int len;
  vertex up(vertex a, vertex b) {
    return vertex(max(a.ma, max(b.ma, a.r + b.l)), max(a.l, a.all + b.l),
                  max(b.r, b.all + a.r), a.all + b.all);
  }
  void build(int n, long double *sum) {
    for (len = 1; len < n; len *= 2)
      ;
    t.resize(2 * len);
    for (int i = 0; i < n; i++)
      t[i + len].all = sum[i],
            t[i + len].ma = t[i + len].l = t[i + len].r = max(0.0, sum[i]);
    for (int i = len - 1; i > 0; i--) t[i] = up(t[2 * i], t[2 * i + 1]);
  }
  vertex ma(int tl, int tr, int v, int l, int r) {
    if (tl > tr) return vertex(0, 0, 0, 0);
    if (tl == l && tr == r) return t[v];
    int s = (l + r) / 2;
    return up(ma(tl, min(s, tr), 2 * v, l, s),
              ma(max(tl, s + 1), tr, 2 * v + 1, s + 1, r));
  }
};
tree t;
int main() {
  ios_base::sync_with_stdio(false);
  int n, m, c;
  cin >> n >> m >> c;
  for (int i = 0; i < n; i++) cin >> x[i];
  for (int i = 0; i < n - 1; i++) cin >> p[i], p[i] /= 100;
  for (int i = 0; i < m; i++) cin >> a[i] >> b[i], a[i]--, b[i]--;
  for (int i = 0; i < n - 1; i++) {
    sum[i] = (long double)(x[i + 1] - x[i]) / 2.0 - p[i] * c;
  }
  t.build(n - 1, sum);
  long double ans = 0;
  for (int i = 0; i < m; i++) {
    int len = t.len;
    ans +=
        (long double)t.ma(a[i] + len, b[i] - 1 + len, 1, len, len * 2 - 1).ma;
  }
  cout.setf(ios::fixed);
  cout.precision(20);
  cout << ans;
  return 0;
}
