#include <bits/stdc++.h>
using namespace std;
class TREE {
 public:
  double sum, p, s, ans;
  TREE() {}
  TREE(double val) : sum(val), p(val), s(val), ans(val) {}
} t[4 * 310000];
double a[310000];
int x[310000], p[310000];
TREE unite(TREE l, TREE r) {
  TREE res;
  res.sum = l.sum + r.sum;
  res.p = max(l.p, l.sum + r.p);
  res.s = max(r.s, r.sum + l.s);
  res.ans = max(max(l.ans, r.ans), l.s + r.p);
  return res;
}
void build(int v, int tl, int tr) {
  if (tl == tr) {
    t[v] = TREE(a[tl]);
    return;
  }
  int tm = (tl + tr) >> 1;
  build(v + v, tl, tm);
  build(v + v + 1, tm + 1, tr);
  t[v] = unite(t[v + v], t[v + v + 1]);
}
void update(int v, int tl, int tr, int pos, int val) {
  if (tl == tr) {
    t[v] = TREE(val);
    return;
  }
  int tm = (tl + tr) >> 1;
  if (pos <= tm)
    update(v + v, tl, tm, pos, val);
  else
    update(v + v + 1, tm + 1, tr, pos, val);
  t[v] = unite(t[v + v], t[v + v + 1]);
}
TREE get(int v, int tl, int tr, int l, int r) {
  if (l > r) return -1;
  if (tl == l && tr == r) return t[v];
  int tm = (tl + tr) >> 1;
  if (r <= tm) return get(v + v, tl, tm, l, r);
  if (l > tm) return get(v + v + 1, tm + 1, tr, l, r);
  return unite(get(v + v, tl, tm, l, min(r, tm)),
               get(v + v + 1, tm + 1, tr, max(l, tm + 1), r));
}
int main() {
  int n, m, c;
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= n; i++) scanf("%d", &x[i]);
  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]) / 2.0 - c * (p[i] / 100.0);
  build(1, 1, n - 1);
  double ans = 0.0;
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    double tmp = get(1, 1, n - 1, a, --b).ans;
    if (tmp >= -(1e-9)) ans += tmp;
  }
  printf("%.20lf\n", ans);
  return 0;
}
