#include <bits/stdc++.h>
using namespace std;
const int MAXN = 150010;
struct Node {
  int left, right;
  double lmax, rmax, sum, w;
};
int n, m, c, u, v, dis[MAXN];
double per, earn[MAXN], ans;
Node tree[4 * MAXN];
Node Update(Node A, Node B) {
  Node X;
  X.sum = A.sum + B.sum;
  X.lmax = max(A.lmax, A.sum + B.lmax);
  X.rmax = max(B.rmax, B.sum + A.rmax);
  X.w = max(max(A.w, B.w), A.rmax + B.lmax);
  return X;
}
void Build(int l, int r, int t) {
  tree[t].left = l;
  tree[t].right = r;
  if (l == r) {
    tree[t].sum = earn[l];
    tree[t].w = (earn[l] > 0 ? earn[l] : 0);
    tree[t].lmax = tree[t].w;
    tree[t].rmax = tree[t].w;
    return;
  }
  int mid = (l + r) >> 1;
  Build(l, mid, (t << 1));
  Build(mid + 1, r, ((t << 1) + 1));
  tree[t] = Update(tree[(t << 1)], tree[((t << 1) + 1)]);
  tree[t].left = l;
  tree[t].right = r;
}
Node Query(int l, int r, int t) {
  if (tree[t].left == l && tree[t].right == r) return tree[t];
  int mid = (tree[t].left + tree[t].right) >> 1;
  if (r <= mid) return Query(l, r, (t << 1));
  if (l > mid) return Query(l, r, ((t << 1) + 1));
  return Update(Query(l, mid, (t << 1)), Query(mid + 1, r, ((t << 1) + 1)));
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= n; ++i) scanf("%d", &dis[i]);
  for (int i = 1; i < n; ++i) {
    scanf("%lf", &per);
    earn[i] = (dis[i + 1] - dis[i] + 0.0) / 2 - per * c / 100.0;
  }
  Build(1, n - 1, 1);
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", &u, &v);
    Node A = Query(u, v - 1, 1);
    ans += A.w;
  }
  printf("%.8lf\n", ans);
  return 0;
}
