#include <bits/stdc++.h>
using namespace std;
const int maxn = 150000 + 5, inf = 0x3f3f3f3f;
const long long mod = 1e9 + 7;
double eps = 1e-6, pi = acos(-1.0);
template <class T>
T QuickMod(T a, T b, T c) {
  T ans = 1;
  while (b) {
    if (b & 1) ans = ans * a % c;
    b >>= 1;
    a = (a * a) % c;
  }
  return ans;
}
template <class T>
T Gcd(T a, T b) {
  return b != 0 ? Gcd(b, a % b) : a;
}
template <class T>
T Lcm(T a, T b) {
  return a / Gcd(a, b) * b;
}
template <class T>
void outln(T x) {
  cout << x << endl;
}
long long a[maxn], b[maxn];
int n, m, c, p;
struct SegTree {
  struct node {
    long long l, r, sum, ma;
  } nd[maxn << 2];
  void build(int l, int r, int root) {
    if (l == r)
      nd[root].ma = nd[root].l = nd[root].r = nd[root].sum = b[l];
    else {
      int m = (l + r) >> 1;
      build(l, m, root << 1);
      build(m + 1, r, root << 1 | 1);
      nd[root] = pushUp(nd[root << 1], nd[root << 1 | 1]);
    }
  }
  node pushUp(node &l, node &r) {
    node t;
    t.sum = l.sum + r.sum;
    t.l = max(l.l, r.l + l.sum);
    t.r = max(r.r, l.r + r.sum);
    t.ma = max(max(l.ma, r.ma), l.r + r.l);
    return t;
  }
  node query(int L, int R, int l, int r, int root) {
    if (L <= l && R >= r) return nd[root];
    int m = (l + r) >> 1;
    if (R <= m) return query(L, R, l, m, root << 1);
    if (L > m) return query(L, R, m + 1, r, root << 1 | 1);
    node a = query(L, m, l, m, root << 1),
         b = query(m + 1, R, m + 1, r, root << 1 | 1);
    return pushUp(a, b);
  }
} T;
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 0; i < n; i++) scanf("%I64d", a + i);
  for (int i = 1; i < n; i++) {
    scanf("%d", &p);
    b[i] = (a[i] - a[i - 1]) * 50 - p * c;
  }
  T.build(1, n - 1, 1);
  long long ans = 0;
  while (m--) {
    int l, r;
    scanf("%d%d", &l, &r);
    ans += max(0ll, T.query(l, r - 1, 1, n - 1, 1).ma);
  }
  printf("%.10f\n", ans / 100.0);
  return 0;
}
