#include <bits/stdc++.h>
using namespace std;
const int MAXN = 524288;
const int MAXK = MAXN / 2;
struct data {
  double sum, pref, suff, ans;
};
data t[MAXN];
double a[MAXK];
vector<int> atmp;
vector<int> ptmp;
int n, m, c;
data make_data(double val) {
  data res;
  res.sum = val;
  res.pref = res.suff = res.ans = max(0.0, val);
  return res;
}
data combine(data l, data r) {
  data res;
  res.sum = l.sum + r.sum;
  res.pref = max(l.pref, l.sum + r.pref);
  res.suff = max(r.suff, r.sum + l.suff);
  res.ans = max(max(l.ans, r.ans), l.suff + r.pref);
  return res;
}
void build(double a[], int v, int tl, int tr) {
  if (tl == tr)
    t[v] = make_data(a[tl]);
  else {
    int tm = (tl + tr) / 2;
    build(a, v * 2, tl, tm);
    build(a, v * 2 + 1, tm + 1, tr);
    t[v] = combine(t[v * 2], t[v * 2 + 1]);
  }
}
data query(int v, int tl, int tr, int l, int r) {
  if (l == tl && tr == r) return t[v];
  int tm = (tl + tr) / 2;
  if (r <= tm) return query(v * 2, tl, tm, l, r);
  if (l > tm) return query(v * 2 + 1, tm + 1, tr, l, r);
  return combine(query(v * 2, tl, tm, l, tm),
                 query(v * 2 + 1, tm + 1, tr, tm + 1, r));
}
void Init() {
  for (int i = 0; i < n - 1; i++)
    a[i] = double(atmp[i + 1] - atmp[i]) / 2 - double(c) * ptmp[i] / 100;
}
int main() {
  cin >> n >> m >> c;
  atmp.resize(n);
  ptmp.resize(n);
  for (int i = 0; i < n; i++) cin >> atmp[i];
  for (int i = 0; i < n - 1; i++) cin >> ptmp[i];
  Init();
  build(a, 1, 0, MAXK - 1);
  double res = 0;
  for (int i = 0; i < m; i++) {
    int x1, x2;
    cin >> x1 >> x2;
    data tmp = query(1, 0, MAXK - 1, x1 - 1, x2 - 2);
    res += tmp.ans;
  }
  printf("%0.10lf", res);
  return 0;
}
