#include <bits/stdc++.h>
using namespace std;
long long maxi(long long a, long long b) {
  if (a > b) return a;
  return b;
}
struct prze {
  int a, b;
};
struct node {
  long long s, max_s, max_pref, max_suf;
};
vector<node> T;
int l, size;
void Stworz(int n, vector<long long>& ex) {
  int p = 1;
  while (p < n) p *= 2;
  l = p;
  size = 2 * p - 1;
  for (int i = 0; i <= size; ++i) T.push_back({0, 0, 0, 0});
  for (int i = 0; i < ex.size(); ++i) T[i + l] = {ex[i], ex[i], ex[i], ex[i]};
  for (int i = l - 1; i >= 1; --i) {
    T[i].s = T[2 * i].s + T[2 * i + 1].s;
    T[i].max_pref = max(T[2 * i].max_pref, T[2 * i].s + T[2 * i + 1].max_pref);
    T[i].max_suf = max(T[2 * i + 1].max_suf, T[2 * i + 1].s + T[2 * i].max_suf);
    T[i].max_s = maxi(T[2 * i].max_s, T[2 * i + 1].max_s);
    T[i].max_s = maxi(T[i].max_s, T[2 * i].max_suf + T[2 * i + 1].max_pref);
  }
}
long long Max(int a, int b) {
  a += l;
  b += l;
  vector<node> L, P;
  L.push_back(T[a]);
  if (a != b) P.push_back(T[b]);
  while (a / 2 != b / 2) {
    if (a % 2 == 0) L.push_back(T[a + 1]);
    if (b % 2 == 1) P.push_back(T[b - 1]);
    a /= 2;
    b /= 2;
  }
  reverse(P.begin(), P.end());
  vector<node> wsz;
  wsz = L;
  for (int i = 0; i < P.size(); ++i) wsz.push_back(P[i]);
  long long odp = 0;
  for (int i = 0; i < wsz.size(); ++i) odp = maxi(odp, wsz[i].max_s);
  for (int i = 0; i < (int)wsz.size() - 1; ++i)
    odp = maxi(odp, wsz[i].max_suf + wsz[i + 1].max_pref);
  for (int i = 0; i < wsz.size(); ++i) {
    long long suma = 0;
    for (int j = i; j < wsz.size(); ++j) {
      suma += wsz[j].s;
      long long c = suma;
      if (i - 1 >= 0 && wsz[i - 1].max_suf > 0) c += wsz[i - 1].max_suf;
      if (j + 1 < wsz.size() && wsz[j + 1].max_pref > 0)
        c += wsz[j + 1].max_pref;
      odp = maxi(odp, c);
    }
  }
  return odp;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  long long c;
  cin >> n >> m >> c;
  vector<long long> a(n);
  for (int i = 0; i < n; ++i) cin >> a[i];
  vector<long long> p(n - 1);
  for (int i = 0; i < n - 1; ++i) cin >> p[i];
  vector<prze> s(m);
  for (int i = 0; i < m; ++i) {
    cin >> s[i].a >> s[i].b;
    --s[i].a;
    --s[i].b;
  }
  vector<long long> ex(n - 1);
  for (int i = 0; i < n - 1; ++i) ex[i] = 50 * (a[i + 1] - a[i]) - p[i] * c;
  Stworz(n, ex);
  long long odp = 0;
  for (int i = 0; i < m; ++i) odp += Max(s[i].a, s[i].b - 1);
  cout << fixed << setprecision(10) << (double)(odp / 100.0);
  return 0;
}
