#include <bits/stdc++.h>
using namespace std;
vector<double> prf;
const int MAXN = 500000;
vector<double> tree[3 * MAXN];
vector<double> comb(vector<double> a, vector<double> b) {
  vector<double> res(4);
  res[0] = max(a[0], a[3] + b[0]);
  res[1] = max(b[1], b[3] + a[1]);
  res[2] = max(max(a[2], b[2]), a[1] + b[0]);
  res[3] = a[3] + b[3];
  return res;
}
int N;
void init(int L = 0, int R = N - 1, int idx = 1) {
  if (L == R) {
    tree[idx].resize(4);
    tree[idx][0] = max(0.0, prf[L]);
    tree[idx][1] = max(0.0, prf[L]);
    tree[idx][2] = max(0.0, prf[L]);
    tree[idx][3] = prf[L];
    return;
  }
  int mid = (L + R) / 2;
  init(L, mid, idx * 2);
  init(mid + 1, R, idx * 2 + 1);
  tree[idx] = comb(tree[idx * 2], tree[idx * 2 + 1]);
}
vector<double> solve(int L, int R, int idx = 1, int gL = 0, int gR = N - 1) {
  if (gL == L && gR == R) return tree[idx];
  int mid = (gL + gR) / 2;
  if (R <= mid) return solve(L, R, idx * 2, gL, mid);
  if (L > mid) return solve(L, R, idx * 2 + 1, mid + 1, gR);
  return comb(solve(L, mid, idx * 2, gL, mid),
              solve(mid + 1, R, idx * 2 + 1, mid + 1, gR));
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  long long c;
  cin >> c;
  if (MAXN < 100000) return 0;
  vector<int> price(n);
  for (int i = (0); i < (n); ++i) scanf("%d", &price[i]);
  vector<int> ps(n - 1);
  for (int i = (0); i < (n - 1); ++i) scanf("%d", &ps[i]);
  N = 1;
  while (N < n) N *= 2;
  prf.resize(N, 0);
  for (int i = (0); i < (n - 1); ++i) {
    double v = price[i + 1] - price[i];
    double profit = 0.5 * v - 0.01 * ps[i] * c;
    prf[i] = profit;
  }
  init();
  double res = 0;
  for (int i = (0); i < (m); ++i) {
    int l, r;
    scanf("%d%d", &l, &r);
    l--;
    r--;
    r--;
    res += solve(l, r)[2];
  }
  int k = 0;
  printf("%.7lf\n", res);
  return 0;
}
