#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const double eps = 1e-9;
namespace std {
template <>
struct hash<pair<
    pair<pair<unsigned int, unsigned int>, pair<unsigned int, unsigned int> >,
    unsigned int> > {
  size_t operator()(const pair<pair<pair<unsigned int, unsigned int>,
                                    pair<unsigned int, unsigned int> >,
                               unsigned int> &obj) const {
    const unsigned int mul = 10007;
    return (((((((obj.first.first.first * mul) + obj.first.first.second) *
                mul) +
               obj.first.second.first) *
              mul) +
             obj.first.second.second) *
            mul) +
           obj.second;
  }
};
}  // namespace std
int N, M, C, RUN;
int x[200000];
int prob[200000];
long long loo;
long long base[200000];
long long segTree[4][800000];
long long tmpSegTree[4][800000];
int lastRun[4][800000];
long long query(int id, int f, int t, int ff, int tt, int flag) {
  ff = max(f, ff);
  tt = min(t, tt);
  if (ff >= tt) return 0;
  if (ff + 1 == tt) {
    if (flag == 3)
      return base[ff];
    else
      return max(base[ff], 0LL);
  }
  long long *res = NULL;
  bool todo = false;
  if (f == ff && t == tt) {
    res = segTree[flag] + id;
    todo = (res[0] == loo);
  } else {
    res = tmpSegTree[flag] + id;
    todo = (lastRun[flag][id] != RUN);
  }
  if (todo) {
    res[0] = 0;
    int mid = (t - f) / 2 + f;
    int leftId = id * 2 + 1;
    int rightId = id * 2 + 2;
    switch (flag) {
      case 0:
        res[0] = query(leftId, f, mid, ff, tt, 0);
        res[0] = max(res[0], query(rightId, mid, t, ff, tt, 0));
        res[0] = max(res[0], query(leftId, f, mid, ff, tt, 1) +
                                 query(rightId, mid, t, ff, tt, 2));
        break;
      case 1:
        res[0] = query(leftId, f, mid, ff, tt, 1) +
                 query(rightId, mid, t, ff, tt, 3);
        res[0] = max(res[0], query(rightId, mid, t, ff, tt, 1));
        break;
      case 2:
        res[0] = query(leftId, f, mid, ff, tt, 3) +
                 query(rightId, mid, t, ff, tt, 2);
        res[0] = max(res[0], query(leftId, f, mid, ff, tt, 2));
        break;
      case 3:
        res[0] = query(leftId, f, mid, ff, tt, 3) +
                 query(rightId, mid, t, ff, tt, 3);
        break;
    }
    lastRun[flag][id] = RUN;
  }
  return res[0];
}
int main() {
  cin >> N >> M >> C;
  for (int i = (0); i < (N); i++) cin >> x[i];
  for (int i = (0); i < (N - 1); i++) cin >> prob[i];
  for (int i = (0); i < (N - 1); i++) {
    base[i] = (x[i + 1] - x[i]) * 50LL - prob[i] * C;
  }
  memset(lastRun, -1, sizeof(lastRun));
  memset(segTree, oo, sizeof(segTree));
  loo = segTree[0][0];
  RUN = 0;
  long long res = 0;
  while (M--) {
    int a, b;
    cin >> a >> b;
    RUN++;
    long long cres = query(0, 0, N - 1, a - 1, b - 1, 0);
    res += cres;
  }
  printf("%.2lf\n", res * 0.01);
  return 0;
}
