#include <bits/stdc++.h>
using namespace std;
struct node {
  double sum, msum, lsum, rsum;
  int cnt;
};
int n, m, c, x[1000002], p[1000002];
node ob[1000002];
void tree_update(int idx) {
  int l = 2 * idx, r = 2 * idx + 1;
  ob[idx].sum = ob[l].sum + ob[r].sum;
  ob[idx].lsum = ((ob[l].lsum) > (ob[l].sum + ob[r].lsum + 1e-9)
                      ? (ob[l].lsum)
                      : (ob[l].sum + ob[r].lsum));
  ob[idx].rsum = ((ob[r].rsum) > (ob[l].rsum + ob[r].sum + 1e-9)
                      ? (ob[r].rsum)
                      : (ob[l].rsum + ob[r].sum));
  ob[idx].msum =
      ((ob[l].msum) > (ob[r].msum + 1e-9) ? (ob[l].msum) : (ob[r].msum));
  ob[idx].msum = ((ob[idx].msum) > (ob[l].rsum + ob[r].lsum + 1e-9)
                      ? (ob[idx].msum)
                      : (ob[l].rsum + ob[r].lsum));
}
void tree_insert(int idx, int st, int ed, int i, double val) {
  if (st == ed) {
    ob[idx].sum = val;
    ob[idx].lsum = ((ob[idx].lsum) > (val + 1e-9) ? (ob[idx].lsum) : (val));
    ob[idx].rsum = ((ob[idx].rsum) > (val + 1e-9) ? (ob[idx].rsum) : (val));
    ob[idx].msum = ((ob[idx].msum) > (val + 1e-9) ? (ob[idx].msum) : (val));
    ob[idx].cnt++;
    return;
  }
  int mid = (st + ed) / 2, l = 2 * idx, r = 2 * idx + 1;
  if (i <= mid)
    tree_insert(l, st, mid, i, val);
  else
    tree_insert(r, mid + 1, ed, i, val);
  ob[idx].cnt++;
  if (ob[idx].cnt == (ed - st + 1)) tree_update(idx);
}
node tree_query(int idx, int st, int ed, int a, int b) {
  if (st == a && ed == b) return ob[idx];
  int mid = (st + ed) / 2, l = 2 * idx, r = 2 * idx + 1;
  if (mid >= b) return tree_query(l, st, mid, a, b);
  if (a > mid) return tree_query(r, mid + 1, ed, a, b);
  node p, lc, rc;
  lc = tree_query(l, st, mid, a, mid);
  rc = tree_query(r, mid + 1, ed, mid + 1, b);
  p.sum = lc.sum + rc.sum;
  p.lsum =
      ((lc.lsum) > (lc.sum + rc.lsum + 1e-9) ? (lc.lsum) : (lc.sum + rc.lsum));
  p.rsum =
      ((rc.rsum) > (rc.sum + lc.rsum + 1e-9) ? (rc.rsum) : (rc.sum + lc.rsum));
  p.msum = ((lc.msum) > (rc.msum + 1e-9) ? (lc.msum) : (rc.msum));
  p.msum =
      ((p.msum) > (lc.rsum + rc.lsum + 1e-9) ? (p.msum) : (lc.rsum + rc.lsum));
  return p;
}
int main() {
  int a, b, i;
  double val, pp, res;
  node tn;
  cin >> n >> m >> c;
  for (i = 1; i <= n; i++) cin >> x[i];
  for (i = 1; i < n; i++) {
    cin >> p[i];
    pp = p[i] / 100.0;
    val = (x[i + 1] - x[i]) / 2.0 - pp * c;
    tree_insert(1, 1, n - 1, i, val);
  }
  res = 0;
  for (i = 0; i < m; i++) {
    cin >> a >> b;
    tn = tree_query(1, 1, n - 1, a, b - 1);
    res += tn.msum;
  }
  printf("%.8lf\n", res);
  return 0;
}
