#include <bits/stdc++.h>
using namespace std;
long long sle[1 << 19], sri[1 << 19], s[1 << 19], mid[1 << 19];
long long z[1 << 18];
vector<int> nodos;
void construir(int x = 0, int le = 0, int ri = 1 << 18) {
  if (le + 1 == ri) {
    sle[x] = sri[x] = s[x] = mid[x] = z[le];
    return;
  }
  int me = (le + ri) / 2;
  construir((x + x + 1), le, me);
  construir((x + x + 2), me, ri);
  s[x] = s[(x + x + 1)] + s[(x + x + 2)];
  mid[x] = max(max(mid[(x + x + 1)], mid[(x + x + 2)]),
               sri[(x + x + 1)] + sle[(x + x + 2)]);
  sle[x] = max(sle[(x + x + 1)], s[(x + x + 1)] + sle[(x + x + 2)]);
  sri[x] = max(sri[(x + x + 2)], s[(x + x + 2)] + sri[(x + x + 1)]);
}
void get(int a, int b, int x = 0, int le = 0, int ri = 1 << 18) {
  if (b <= le || ri <= a) return;
  if (a <= le && ri <= b) {
    nodos.push_back(x);
    return;
  }
  int me = (le + ri) / 2;
  get(a, b, (x + x + 1), le, me);
  get(a, b, (x + x + 2), me, ri);
}
long long maxwindow(int a, int b) {
  nodos.clear();
  get(a - 1, b - 1);
  long long mn = 0, res = 0, suma = 0;
  for (int i = 0; i < nodos.size(); i++) {
    int x = nodos[i];
    res = max(res, mid[x]);
    res = max(res, suma + sle[x] - mn);
    suma += s[x];
    mn = min(mn, suma - sri[x]);
  }
  return res;
}
void read(int &x) { scanf("%d", &x); }
int n, q, c;
int p[150005];
int x[150005];
long long fuerza(int a, int b) {
  long long res = 0, mn = 0, suma = 0;
  for (int i = a - 1; i < b - 1; i++) {
    res = max(res, z[i]);
    res = max(res, suma + z[i] - mn);
    suma += z[i];
    mn = min(mn, suma - z[i]);
  }
  return res;
}
int main() {
  cin >> n >> q >> c;
  for (int i = 0; i < n; i++) scanf("%d", x + i);
  for (int i = 0; i < n - 1; i++) scanf("%d", p + i);
  n--;
  for (int i = 0; i < n; i++) z[i] = (x[i + 1] - x[i]) * 50LL - c * p[i];
  construir();
  long long res = 0;
  for (int qq = 0; qq < q; qq++) {
    int u, v;
    read(u);
    read(v);
    res += maxwindow(u, v);
  }
  cout << res / 100 << ".";
  int rr = res % 100;
  printf("%02d\n", rr);
}
