#include <bits/stdc++.h>
using namespace std;
struct state {
  int l, r;
  long long sm, lm, rm, mm;
  state() {}
  state(int l, int r, long long sm, long long lm, long long rm, long long mm)
      : l(l), r(r), sm(sm), lm(lm), rm(rm), mm(mm) {}
} data[4 * 150009];
int n, m, c;
long long x[150009];
state comb(state a, state b) {
  long long lm = max(a.lm, a.sm + b.lm);
  long long rm = max(b.rm, b.sm + a.rm);
  long long mm = max(a.rm + b.lm, max(a.mm, b.mm));
  return state(a.l, b.r, a.sm + b.sm, lm, rm, mm);
}
void maketree(int l, int r, int rt) {
  if (l == r) {
    long long t = max(0ll, x[l]);
    data[rt] = state(l, r, x[l], t, t, t);
    return;
  }
  int mid = (l + r) >> 1;
  maketree(l, mid, rt << 1);
  maketree(mid + 1, r, rt << 1 | 1);
  data[rt] = comb(data[rt << 1], data[rt << 1 | 1]);
}
state query(int s, int t, int rt) {
  int l = data[rt].l, r = data[rt].r;
  if (s <= l && t >= r) return data[rt];
  int mid = (l + r) >> 1;
  if (t <= mid)
    return query(s, t, rt << 1);
  else if (s > mid)
    return query(s, t, rt << 1 | 1);
  else
    return comb(query(s, t, rt << 1), query(s, t, rt << 1 | 1));
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= n; i++) scanf("%I64d", x + i);
  for (int i = 1; i < n; i++) {
    int p;
    scanf("%d", &p);
    x[i] = x[i + 1] - x[i];
    x[i] = 50 * x[i] - p * c;
  }
  maketree(1, n - 1, 1);
  double ans = 0;
  while (m--) {
    int l, r;
    scanf("%d%d", &l, &r);
    ans += 1.0 * query(l, r - 1, 1).mm / 100;
  }
  printf("%.9lf\n", ans);
}
