#include <bits/stdc++.h>
using namespace std;
const int maxn = 160000;
struct pp {
  double s, m, ml, mr;
} tree[maxn << 2];
double b[maxn], x[maxn], p[maxn];
int n, m, c;
void pushup(int rt) {
  tree[rt].ml = max(tree[rt << 1].ml, tree[rt << 1].s + tree[(rt << 1) + 1].ml);
  tree[rt].mr =
      max(tree[rt << 1].mr + tree[(rt << 1) + 1].s, tree[(rt << 1) + 1].mr);
  tree[rt].s = tree[rt << 1].s + tree[(rt << 1) + 1].s;
  tree[rt].m = max(tree[rt << 1].m, tree[(rt << 1) + 1].m);
  tree[rt].m = max(tree[rt].m, tree[rt << 1].mr + tree[(rt << 1) + 1].ml);
}
void build(int rt, int l, int r) {
  if (l == r) {
    tree[rt].s = b[l];
    tree[rt].m = tree[rt].ml = tree[rt].mr = b[l] > 0 ? b[l] : 0;
    return;
  }
  int mid = (l + r) >> 1;
  build(rt << 1, l, mid), build(rt << 1 | 1, mid + 1, r);
  pushup(rt);
}
pp query(int rt, int l, int r, int ll, int rr) {
  if (l == ll && r == rr) {
    return tree[rt];
  }
  int mid = (l + r) >> 1;
  if (mid + 1 <= ll)
    return query(rt << 1 | 1, mid + 1, r, ll, rr);
  else if (rr <= mid)
    return query(rt << 1, l, mid, ll, rr);
  {
    pp p1 = query(rt << 1, l, mid, ll, mid),
       p2 = query(rt << 1 | 1, mid + 1, r, mid + 1, rr);
    pp p;
    p.s = p1.s + p2.s;
    p.m = max(p1.m, p2.m);
    p.m = max(p.m, p1.mr + p2.ml);
    p.ml = max(p1.s + p2.ml, p1.ml);
    p.mr = max(p2.s + p1.mr, p2.mr);
    return p;
  }
}
int main() {
  cin >> n >> m >> c;
  for (int i = 1; i <= n; i++) scanf("%lf", &x[i]);
  for (int i = 1; i < n; i++) scanf("%lf", &p[i]);
  for (int i = 1; i < n; i++) {
    b[i] = (x[i + 1] - x[i]) / 2.0 - p[i] / 100.0 * c;
  }
  build(1, 1, n - 1);
  double ans = 0;
  for (int i = 0; i < m; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    r--;
    ans += query(1, 1, n - 1, l, r).m;
  }
  printf("%.6lf\n", ans);
}
