#include <bits/stdc++.h>
using namespace std;
template <class T>
T abs(T x) {
  return x > 0 ? x : -x;
}
struct node {
  double left, right, mid, sum;
};
node inf;
int n;
int m, c;
int x[150000], p[150000];
node tree[600000];
node un(node a, node b) {
  node c;
  c.left = max(a.left, a.sum + b.left);
  c.mid = max(a.right + b.left, max(a.mid, b.mid));
  c.right = max(b.right, a.right + b.sum);
  c.sum = a.sum + b.sum;
  return c;
}
node add(int x, int l, int r, int p, double q) {
  if (r < p || l > p) return tree[x];
  if (l == r) {
    if (q > 0) tree[x].left = tree[x].mid = tree[x].right = q;
    tree[x].sum = q;
    return tree[x];
  }
  int s = (l + r) / 2;
  return tree[x] =
             un(add(x * 2 + 1, l, s, p, q), add(x * 2 + 2, s + 1, r, p, q));
}
node get(int x, int l, int r, int lc, int rc) {
  if (r < lc || l > rc) return inf;
  if (l >= lc && r <= rc) return tree[x];
  int s = (l + r) / 2;
  return un(get(x * 2 + 1, l, s, lc, rc), get(x * 2 + 2, s + 1, r, lc, rc));
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 0; i < n; i++) scanf("%d", &x[i]);
  for (int i = 0; i + 1 < n; i++) scanf("%d", &p[i]);
  memset(tree, 0, sizeof(tree));
  for (int i = 0; i + 1 < n; i++)
    add(0, 0, n - 2, i, (x[i + 1] - x[i]) / 2.0 - p[i] / 100.0 * c);
  double ans = 0;
  inf.left = inf.right = inf.mid = inf.sum = -1e18;
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--;
    b -= 2;
    ans += get(0, 0, n - 2, a, b).mid;
  }
  printf("%.10f\n", ans);
  return 0;
}
