#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
const int INF = 1000 * 1000 * 1000 + 7;
const long long LINF = (long long)INF * INF;
const int MAX = 150 * 1000 + 7;
int x[MAX];
double p[MAX];
double a[MAX];
struct Node {
  double sum;
  double mxPref;
  double mxSuf;
  double mxSum;
  Node() : sum(0), mxPref(-LINF), mxSuf(-LINF), mxSum(-LINF) {}
} T[MAX << 2];
Node merge(Node a, Node b) {
  Node res;
  res.sum = a.sum + b.sum;
  res.mxPref = max(a.mxPref, a.sum + b.mxPref);
  res.mxSuf = max(b.mxSuf, a.mxSuf + b.sum);
  res.mxSum = max(max(a.mxSum, b.mxSum), a.mxSuf + b.mxPref);
  return res;
}
void build(int v, int tl, int tr) {
  if (tl == tr) {
    T[v].sum = a[tl];
    T[v].mxSum = T[v].mxPref = T[v].mxSuf = max(0.0, a[tl]);
    return;
  }
  int tm = (tl + tr) >> 1;
  build(v << 1, tl, tm);
  build((v << 1) ^ 1, tm + 1, tr);
  T[v] = merge(T[v << 1], T[(v << 1) ^ 1]);
}
Node query(int v, int tl, int tr, int l, int r) {
  if (l > tr || r < tl) {
    return Node();
  }
  if (l == tl && r == tr) {
    return T[v];
  }
  int tm = (tl + tr) >> 1;
  return merge(query(v << 1, tl, tm, l, min(r, tm)),
               query((v << 1) ^ 1, tm + 1, tr, max(l, tm + 1), r));
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cout << fixed << setprecision(10);
  int n, m, c;
  cin >> n >> m >> c;
  for (int i = (0); i < (n); ++i) {
    cin >> x[i];
  }
  for (int i = (0); i < (n - 1); ++i) {
    cin >> p[i];
    p[i] /= 100;
  }
  for (int i = (0); i < (n - 1); ++i) {
    a[i] = (x[i + 1] - x[i]) / 2.0 - p[i] * c;
  }
  build(1, 0, n - 2);
  double ans = 0;
  for (int i = (0); i < (m); ++i) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    ans += query(1, 0, n - 2, u, v - 1).mxSum;
  }
  cout << ans;
  return 0;
}
