#include <bits/stdc++.h>
using namespace std;
int x[200005];
int n, m, cost;
double p[200005];
double val[200005];
double rmax[200005 << 2];
double mmax[200005 << 2];
double lmax[200005 << 2];
double sumv[200005 << 2];
double ll, mm, rr, ss;
void push_up(int rt) {
  sumv[rt] = sumv[rt << 1] + sumv[rt << 1 | 1];
  mmax[rt] = max(mmax[rt << 1], mmax[rt << 1 | 1]);
  mmax[rt] = max(mmax[rt], rmax[rt << 1] + lmax[rt << 1 | 1]);
  lmax[rt] = max(lmax[rt << 1], sumv[rt << 1] + lmax[rt << 1 | 1]);
  rmax[rt] = max(rmax[rt << 1 | 1], sumv[rt << 1 | 1] + rmax[rt << 1]);
}
void build(int rt, int L, int R) {
  if (L == R) {
    sumv[rt] = mmax[rt] = lmax[rt] = rmax[rt] = val[L];
    return;
  }
  int mid = L + R >> 1;
  build(rt << 1, L, mid);
  build(rt << 1 | 1, mid + 1, R);
  push_up(rt);
}
void query(int rt, int L, int R, int l, int r) {
  if (l <= L && R <= r) {
    if (ll == -1) {
      ll = lmax[rt];
      rr = rmax[rt];
      mm = mmax[rt];
    } else {
      mm = max(mmax[rt], mm);
      mm = max(mm, rr + lmax[rt]);
      ll = max(ll, ss + lmax[rt]);
      rr = max(rmax[rt], sumv[rt] + rr);
    }
    ss += sumv[rt];
    return;
  }
  int mid = L + R >> 1;
  if (l <= mid) query(rt << 1, L, mid, l, r);
  if (r > mid) query(rt << 1 | 1, mid + 1, R, l, r);
}
int main() {
  scanf("%d%d%d", &n, &m, &cost);
  for (int i = 1; i <= n; i++) {
    scanf("%d", x + i);
  }
  for (int i = 2; i <= n; i++) {
    int a;
    scanf("%d", &a);
    p[i] = (double)a / 100;
  }
  for (int i = 2; i <= n; i++) {
    val[i - 1] = (x[i] - x[i - 1]) * 0.5 - p[i] * cost;
  }
  double res = 0;
  build(1, 1, n - 1);
  for (int tt = 0; tt < m; tt++) {
    int a, b;
    scanf("%d%d", &a, &b);
    b--;
    ll = -1;
    ss = 0;
    query(1, 1, n - 1, a, b);
    if (mm >= 0) res += mm;
  }
  printf("%.7f\n", res);
  return 0;
}
