#include <bits/stdc++.h>
using namespace std;
int n, m, p[150010], a, b;
long long x[150010], c;
struct tree {
  int l, r;
  long long k, lk, rk, all;
} sgt[500010];
void buildtree(int t, int l, int r) {
  sgt[t].l = l;
  sgt[t].r = r;
  if (l == r) {
    sgt[t].all = (x[l] - x[l - 1]) * 50 - c * p[l - 1];
    sgt[t].k = max(sgt[t].all, 0LL);
    sgt[t].lk = max(0LL, sgt[t].k);
    sgt[t].rk = max(0LL, sgt[t].k);
    return;
  }
  int mid = (l + r) / 2;
  buildtree(t * 2, l, mid);
  buildtree(t * 2 + 1, mid + 1, r);
  sgt[t].all = sgt[t * 2].all + sgt[t * 2 + 1].all;
  sgt[t].k = max(sgt[t * 2].rk + sgt[t * 2 + 1].lk,
                 max(sgt[t * 2].k, sgt[t * 2 + 1].k));
  sgt[t].lk = max(sgt[t * 2].lk, sgt[t * 2].all + sgt[t * 2 + 1].lk);
  sgt[t].rk = max(sgt[t * 2 + 1].rk, sgt[t * 2 + 1].all + sgt[t * 2].rk);
}
long long find(int t, int l, int r, long long &lans) {
  if (sgt[t].l == l && sgt[t].r == r) {
    long long ans = max(sgt[t].k, sgt[t].lk + lans);
    lans = max(lans + sgt[t].all, sgt[t].rk);
    return ans;
  }
  int mid = (sgt[t].l + sgt[t].r) / 2;
  if (l > mid) return find(t * 2 + 1, l, r, lans);
  if (r <= mid) return find(t * 2, l, r, lans);
  long long ans = find(t * 2, l, mid, lans);
  ans = max(ans, find(t * 2 + 1, mid + 1, r, lans));
  return max(ans, lans);
}
int main() {
  scanf("%d%d%I64d", &n, &m, &c);
  for (int i = 0; i < n; i++) scanf("%I64d", &x[i]);
  for (int i = 0; i < n - 1; i++) scanf("%d", &p[i]);
  buildtree(1, 1, n - 1);
  double ans = 0;
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &a, &b);
    long long lans = 0;
    ans += find(1, a, b - 1, lans);
  }
  printf("%lf\n", (double)ans / 100);
  return 0;
}
