#include <bits/stdc++.h>
using namespace std;
int n, m, c;
int x[160000], num[160000], p[160000];
long long w[160000];
struct Node {
  int left, right;
  long long key, l, r, sum;
} tree[160000 * 4];
void updata(int step) {
  tree[step].sum = tree[step * 2].sum + tree[step * 2 + 1].sum;
  tree[step].l =
      max(tree[step * 2].l, tree[step * 2].sum + tree[step * 2 + 1].l);
  tree[step].r =
      max(tree[step * 2 + 1].r, tree[step * 2 + 1].sum + tree[step * 2].r);
  tree[step].key = max(tree[step * 2].key, tree[step * 2 + 1].key);
  tree[step].key = max(tree[step].key, tree[step * 2].r + tree[step * 2 + 1].l);
}
void build(int left, int right, int step) {
  tree[step].left = left;
  tree[step].right = right;
  if (left == right) {
    tree[step].l = tree[step].r = tree[step].key = w[left] > 0 ? w[left] : 0;
    tree[step].sum = w[left];
    return;
  }
  int mid = (left + right) / 2;
  build(left, mid, step * 2);
  build(mid + 1, right, step * 2 + 1);
  updata(step);
}
long long ask_r(int left, int step) {
  if (left == tree[step].left) return tree[step].r;
  int mid = (tree[step].left + tree[step].right) / 2;
  if (left <= mid)
    return max(ask_r(left, step * 2) + tree[step * 2 + 1].sum,
               tree[step * 2 + 1].r);
  else
    return ask_r(left, step * 2 + 1);
}
long long ask_l(int right, int step) {
  if (right == tree[step].right) return tree[step].l;
  int mid = (tree[step].left + tree[step].right) / 2;
  if (right > mid)
    return max(ask_l(right, step * 2 + 1) + tree[step * 2].sum,
               tree[step * 2].l);
  else
    return ask_l(right, step * 2);
}
long long ask(int left, int right, int step) {
  if (tree[step].left == left && tree[step].right == right)
    return tree[step].key;
  int mid = (tree[step].left + tree[step].right) / 2;
  if (right <= mid)
    return ask(left, right, step * 2);
  else if (left > mid)
    return ask(left, right, step * 2 + 1);
  else {
    long long ret =
        max(ask(left, mid, step * 2), ask(mid + 1, right, step * 2 + 1));
    ret = max(ret, ask_r(left, step * 2) + ask_l(right, step * 2 + 1));
    return ret;
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= n; i++) scanf("%d", &x[i]);
  for (int i = 1; i < n; i++) scanf("%d", &p[i]);
  for (int i = 1; i < n; i++) {
    w[i] = (long long)(x[i + 1] - x[i]) * 50 - (long long)p[i] * c;
  }
  build(1, n - 1, 1);
  long long ans = 0;
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    ans += ask(x, y - 1, 1);
  }
  printf("%.10f\n", ans * 0.01);
  return 0;
}
