#include <bits/stdc++.h>
using namespace std;
struct node {
  double s, l, r, m;
  node() {}
  node(double v) {
    s = v;
    l = r = m = max(0.0, v);
  }
};
node t[4 * 150100];
int n, m, c, x[150100];
double a[150100];
node unite(node a, node b) {
  node res;
  res.s = a.s + b.s;
  res.l = max(a.l, a.s + b.l);
  res.r = max(b.r, b.s + a.r);
  res.m = max(max(a.m, b.m), a.r + b.l);
  return res;
}
void build(int v, int l, int r) {
  if (l == r)
    t[v] = node(a[l]);
  else {
    int m = (l + r) >> 1;
    build(2 * v, l, m);
    build(2 * v + 1, m + 1, r);
    t[v] = unite(t[2 * v], t[2 * v + 1]);
  }
}
node calc(int v, int tl, int tr, int l, int r) {
  if (l == tl && r == tr) return t[v];
  int tm = (tl + tr) >> 1;
  if (r <= tm) return calc(2 * v, tl, tm, l, r);
  if (l > tm) return calc(2 * v + 1, tm + 1, tr, l, r);
  return unite(calc(2 * v, tl, tm, l, tm),
               calc(2 * v + 1, tm + 1, tr, tm + 1, r));
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 0; i < (n); i++) scanf("%d", &x[i]);
  n--;
  for (int i = 0; i < (n); i++) {
    int v;
    scanf("%d", &v);
    a[i + 1] = (x[i + 1] - x[i]) / 2.0 - v / 100.0 * c;
  }
  build(1, 1, n);
  double ans = 0;
  for (int i = 0; i < (m); i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    ans += max(0.0, calc(1, 1, n, l, r - 1).m);
  }
  printf("%.7lf", ans);
}
