#include <bits/stdc++.h>
using namespace std;
const int maxn = 150050;
const int H = 18, M = 1 << H;
int n, m, c;
long long x[maxn], p[maxn], P[maxn] = {}, f[maxn];
struct Node {
  long long min, max, res;
  Node(long long _min = 0, long long _max = 0, long long _res = 0)
      : min(_min), max(_max), res(_res) {}
};
Node operator+(Node a, Node b) {
  Node res;
  res.min = min(a.min, b.min);
  res.max = max(a.max, b.max);
  res.res = max(max(a.res, b.res), b.max - a.min);
  return res;
}
Node seg[M << 2];
inline void upd(int t) { seg[t] = seg[t + t] + seg[t + t + 1]; }
Node ask(int a, int b) {
  a = a + M - 1, b = b + M + 1;
  Node L(1LL << 40, -1LL << 40, 0), R(1LL << 40, -1LL << 40, 0);
  while (a ^ b ^ 1) {
    if (~a & 1) L = L + seg[a ^ 1];
    if (b & 1) R = seg[b ^ 1] + R;
    a >>= 1;
    b >>= 1;
  }
  return L + R;
}
int main(void) {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= (n); ++i) scanf("%d", x + i);
  for (int i = (2); i <= (n); ++i) scanf("%d", p + i), P[i] = P[i - 1] + p[i];
  for (int i = 1; i <= (n); ++i) f[i] = 50 * x[i] - c * P[i];
  for (int i = 1; i <= (n); ++i) {
    seg[i + M] = Node(f[i], f[i], 0);
  }
  for (int i = (M - 1); i >= (1); --i) upd(i);
  long long ans = 0;
  for (int i = 0; i < (m); ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    ans += ask(a, b).res;
  }
  printf("%.20lf\n", (double)ans / 100);
  return 0;
}
