#include <bits/stdc++.h>
using namespace std;
int a[600005], b, c, d, e, f[600005], i, j, k, l, m, n, p[600005], r;
double g, h;
struct node {
  int l, r, m;
  double lm, rm, mm, s;
} tr[600005];
node up(node ll, node rr) {
  return (node){ll.l,
                rr.r,
                (ll.l + rr.r) >> 1,
                max(0., max(ll.lm, ll.s + rr.lm)),
                max(0., max(rr.rm, rr.s + ll.rm)),
                max(0., max(max(ll.mm, rr.mm), ll.rm + rr.lm)),
                ll.s + rr.s};
}
node ask(int x, int l, int r) {
  if (l == tr[x].l && r == tr[x].r) {
    return tr[x];
  }
  if (r <= tr[x].m) return ask((x << 1), l, r);
  if (l > tr[x].m) return ask((x << 1 ^ 1), l, r);
  return up(ask((x << 1), l, tr[x].m), ask((x << 1 ^ 1), tr[x].m + 1, r));
}
void build(int x, int l, int r) {
  tr[x].l = l;
  tr[x].r = r;
  tr[x].m = (l + r) >> 1;
  if (l == r) {
    tr[x].s = a[l] / 2.0 - p[l] / 100.0 * c;
    tr[x].lm = tr[x].rm = tr[x].mm = max(tr[x].s, 0.);
    return;
  }
  build((x << 1), l, tr[x].m);
  build((x << 1 ^ 1), tr[x].m + 1, r);
  tr[x] = up(tr[(x << 1)], tr[(x << 1 ^ 1)]);
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (i = n; i; i--) a[i] -= a[i - 1];
  for (i = 2; i <= n; i++) scanf("%d", &p[i]);
  build(1, 2, n);
  for (; m; m--) {
    scanf("%d%d", &l, &r);
    h = h + max(ask(1, l + 1, r).mm, 0.);
  }
  printf("%.10lf\n", h);
  return 0;
}
