#include <bits/stdc++.h>
using namespace std;
const int maxn = 600000;
struct Point {
  double lmax, rmax, mma, ke;
  Point(){};
  Point(double x, double y, double z, double zz)
      : lmax(x), rmax(y), mma(z), ke(zz){};
} t[maxn];
int le[maxn], ri[maxn];
double a[maxn];
int x[maxn], p[maxn], n, m, c;
Point hebin(Point x1, Point x2) {
  double l1 = max(x1.lmax, x1.ke + x2.lmax);
  double r1 = max(x2.rmax, x2.ke + x1.rmax);
  double kk = x1.ke + x2.ke;
  double mm = max(x1.mma, max(x2.mma, x1.rmax + x2.lmax));
  return Point(l1, r1, mm, kk);
}
void build(int l, int r, int k) {
  le[k] = l, ri[k] = r;
  if (l == r) {
    if (a[l] > 0)
      t[k] = Point(a[l], a[l], a[l], a[l]);
    else
      t[k] = Point(0, 0, 0, a[l]);
  } else {
    int m = (l + r) >> 1;
    build(l, m, k + k);
    build(m + 1, r, k + k + 1);
    t[k] = hebin(t[k + k], t[k + k + 1]);
  }
}
Point getmax(int l, int r, int k) {
  if (l == le[k] && r == ri[k]) return t[k];
  int m = (le[k] + ri[k]) >> 1;
  if (r <= m)
    return getmax(l, r, k + k);
  else if (l > m)
    return getmax(l, r, k + k + 1);
  else
    return hebin(getmax(l, m, k + k), getmax(m + 1, r, k + k + 1));
}
int main() {
  cin >> 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] = double(x[i + 1] - x[i]) / 2 - double(p[i]) / 100 * c;
  build(1, n - 1, 1);
  double ans = 0;
  for (int i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    ans = ans + getmax(x, y - 1, 1).mma;
  }
  printf("%.7lf\n", ans);
  return 0;
}
