#include <bits/stdc++.h>
using namespace std;
struct node {
  double s, l, r, m;
};
const int maxn = (int)1e5 + 10;
int n, m, c;
int x[maxn * 3];
int p[maxn * 3];
node t[maxn * 6];
int st;
void initFiles() {}
void initRmq() {
  st = 2;
  while (st < n) {
    st *= 2;
  }
  memset(t, 0, sizeof(t));
  for (int i = 0; i < n - 1; i++) {
    double profit = double(x[i + 1] - x[i]) / 2 - double(p[i]) / 100 * c;
    t[st + i].l = t[st + i].r = t[st + i].s = t[st + i].m = profit;
  }
  for (int i = st - 1; i >= 1; i--) {
    t[i].s = t[i * 2].s + t[i * 2 + 1].s;
    t[i].l = max(t[i * 2].s + t[i * 2 + 1].l, t[i * 2].l);
    t[i].r = max(t[i * 2].r + t[i * 2 + 1].s, t[i * 2 + 1].r);
    t[i].m = max(max(t[i * 2].m, t[i * 2 + 1].m), t[i * 2].r + t[i * 2 + 1].l);
  }
}
double doExtractMaxR(int x, int l, int r, int L, int R) {
  if (R < l || r < L) {
    return 0;
  }
  if (L <= l && r <= R) {
    return t[x].r;
  }
  if (L <= (l + r) / 2) {
    return max(doExtractMaxR(x * 2, l, (l + r) / 2, L, R) + t[x * 2 + 1].s,
               t[x * 2 + 1].r);
  } else {
    return doExtractMaxR(x * 2 + 1, (l + r) / 2 + 1, r, L, R);
  }
}
double doExtractMaxL(int x, int l, int r, int L, int R) {
  if (R < l || r < L) {
    return 0;
  }
  if (L <= l && r <= R) {
    return t[x].l;
  }
  if (R >= (l + r) / 2 + 1) {
    return max(t[x * 2].l,
               t[x * 2].s + doExtractMaxL(x * 2 + 1, (l + r) / 2 + 1, r, L, R));
  } else {
    return doExtractMaxL(x * 2, l, (l + r) / 2, L, R);
  }
}
double doExtractMax(int x, int l, int r, int L, int R) {
  if (R < l || r < L) {
    return 0;
  }
  if (L <= l && r <= R) {
    return t[x].m;
  }
  double ans = 0;
  ans = max(ans, doExtractMax(x * 2, l, (l + r) / 2, L, R));
  ans = max(ans, doExtractMax(x * 2 + 1, (l + r) / 2 + 1, r, L, R));
  if (L <= (l + r) / 2 && (l + r) / 2 + 1 <= R) {
    double ans1 = doExtractMaxR(x * 2, l, (l + r) / 2, L, R);
    double ans2 = doExtractMaxL(x * 2 + 1, (l + r) / 2 + 1, r, L, R);
    ans = max(ans, ans1 + ans2);
  }
  return ans;
}
double extractMax(int l, int r) { return doExtractMax(1, 1, st, l + 1, r + 1); }
void solve() {
  scanf("%d %d %d", &n, &m, &c);
  for (int i = 0; i < n; i++) {
    scanf("%d", &x[i]);
  }
  for (int i = 0; i < n - 1; i++) {
    scanf("%d", &p[i]);
  }
  initRmq();
  double ans = 0;
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    x--;
    y--;
    double dans = extractMax(x, y - 1);
    ans += dans;
  }
  printf("%.18lf", ans);
}
int main() {
  initFiles();
  solve();
  return 0;
}
