#include <bits/stdc++.h>
using namespace std;
const long long INF = (long long)1e18;
struct segment {
  long long big, small, diff;
} tree[600010];
int n, m, c, a, b, sum;
long long x[150005], p[150005], cost[150005];
segment empty = {-INF, INF, 0};
long long max(long long a, long long b) { return a > b ? a : b; }
long long min(long long a, long long b) { return a < b ? a : b; }
segment merge(const segment &a, const segment &b) {
  segment ret;
  ret.big = max(a.big, b.big);
  ret.small = min(a.small, b.small);
  ret.diff = max((max(a.diff, b.diff)), b.big - a.small);
  return ret;
}
void build(int cur, int l, int r) {
  if (r - l == 1) {
    tree[cur].big = max(cost[l], cost[r]);
    tree[cur].small = min(cost[l], cost[r]);
    tree[cur].diff = max(0, cost[r] - cost[l]);
    return;
  }
  int mid = (l + r) >> 1;
  build(cur * 2, l, mid);
  build(cur * 2 + 1, mid, r);
  tree[cur] = merge(tree[cur * 2], tree[cur * 2 + 1]);
}
segment query(int cur, int L, int R, int l, int r) {
  if (r <= L || l >= R) return empty;
  if (L <= l && r <= R) return tree[cur];
  int mid = (l + r) >> 1;
  return merge(query(cur * 2, L, R, l, mid), query(cur * 2 + 1, L, R, mid, r));
}
int main() {
  cin >> n >> m >> c;
  for (int i = 0; i < n; i++) cin >> x[i];
  for (int i = 1; i < n; i++) {
    cin >> p[i];
    cost[i] = cost[i - 1] + (x[i] - x[i - 1]) * 50 - c * p[i];
  }
  build(1, 0, n - 1);
  long long cnt = 0;
  for (int i = 0; i < m; i++) {
    cin >> a >> b;
    a--;
    b--;
    cnt += query(1, a, b, 0, n - 1).diff;
  }
  double ans = cnt / 100.0;
  printf("%.6lf\n", ans);
  return 0;
}
