#include <bits/stdc++.h>
using namespace std;
const long long N = 150010;
long long n, m, c, x[N], a, b, p;
double val[N];
struct node {
  double l, r, m, s;
} nd[N << 2];
void build(long long x, long long l, long long r) {
  if (l == r) {
    nd[x].l = nd[x].r = nd[x].m = nd[x].s = val[l];
    return;
  }
  long long m = (l + r) >> 1;
  build(2 * x, l, m);
  build(2 * x + 1, m + 1, r);
  nd[x].s = nd[2 * x].s + nd[2 * x + 1].s;
  nd[x].l = max(nd[2 * x].l, nd[2 * x].s + nd[2 * x + 1].l);
  nd[x].r = max(nd[2 * x + 1].r, nd[2 * x + 1].s + nd[2 * x].r);
  nd[x].m = max(nd[2 * x].m, nd[2 * x + 1].m);
  nd[x].m = max(nd[x].m, nd[2 * x].r + nd[2 * x + 1].l);
}
node query(long long x, long long l, long long r, long long lq, long long rq) {
  if (lq <= l && r <= rq) return nd[x];
  if (l > rq || r < lq) return {0.0, 0.0, 0.0, 0.0};
  long long m = (l + r) >> 1;
  node lt = query(2 * x, l, m, lq, rq);
  node rt = query(2 * x + 1, m + 1, r, lq, rq);
  node ret = {0.0};
  ret.l = max(lt.l, lt.s + rt.l);
  ret.r = max(rt.r, rt.s + lt.r);
  ret.m = max(lt.m, rt.m);
  ret.m = max(ret.m, lt.r + rt.l);
  ret.s = lt.s + rt.s;
  return ret;
}
int main() {
  scanf("%lld%lld%lld", &n, &m, &c);
  for (long long i = 1; i <= n; i++) scanf("%lld", x + i);
  for (long long i = 1; i < n; i++) {
    scanf("%lld", &p);
    val[i] = (x[i + 1] - x[i]) * 0.5 - 0.01 * p * c;
  }
  build(1, 1, n - 1);
  double ans = 0.0;
  for (long long i = 1; i <= m; i++) {
    scanf("%lld%lld", &a, &b);
    node tmp = query(1, 1, n - 1, a, b - 1);
    ans += tmp.m;
  }
  printf("%.12lf\n", ans);
}
