#include <bits/stdc++.h>
using namespace std;
struct smo {
  long double p, s, m, w;
  smo() { p = s = m = w = 0.0; }
} newsmo;
smo Pu(smo a, smo b) {
  smo c = newsmo;
  c.w = a.w + b.w;
  c.p = max(a.p, a.w + b.p);
  c.s = max(b.s, b.w + a.s);
  c.m = max(max(a.m, b.m), a.s + b.p);
  return c;
}
struct som {
  som *l, *r;
  smo m;
  som() {
    l = r = NULL;
    m = newsmo;
  }
  void P() {
    if (l == NULL && r == NULL)
      m = newsmo;
    else if (l == NULL)
      m = Pu(newsmo, r->m);
    else if (r == NULL)
      m = Pu(l->m, newsmo);
    else
      m = Pu(l->m, r->m);
  }
} * rt;
const int N = 150005;
int n, m, c, x[N];
int si;
long double vl;
void G(int l, int r, som *&t) {
  if (t == NULL) t = new som();
  if (l == r) {
    t->m.p = t->m.s = t->m.m = (vl > 0.0 ? vl : 0.0);
    t->m.w = vl;
    return;
  }
  if ((l + r) / 2 >= si)
    G(l, (l + r) / 2, t->l);
  else
    G((l + r) / 2 + 1, r, t->r);
  t->P();
}
void G(int i, long double p) {
  si = i, vl = p;
  G(1, n - 1, rt);
}
int sl, sr;
smo D(int l, int r, som *&t) {
  if (t == NULL) return newsmo;
  if (l >= sl && r <= sr) return t->m;
  int m = (l + r) / 2;
  if (sr <= m) return D(l, m, t->l);
  if (sl > m) return D(m + 1, r, t->r);
  return Pu(D(l, m, t->l), D(m + 1, r, t->r));
}
long double D(int l, int r) {
  sl = l, sr = r;
  return D(1, n - 1, rt).m;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> c;
  for (int i = 1; i <= n; ++i) {
    cin >> x[i];
  }
  for (int i = 1; i < n; ++i) {
    double p;
    cin >> p;
    p /= 100;
    p = (double)(x[i + 1] - x[i]) / 2 - p * c;
    G(i, p);
  }
  long double fp = 0;
  for (int i = 1; i <= m; ++i) {
    int a, b;
    cin >> a >> b;
    fp += D(a, b - 1);
  }
  cout << fixed << setprecision(6) << fp << endl;
  return 0;
}
