#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1300000;
struct Node {
  double min, max, diff;
  Node() {}
  Node(double min, double max, double diff) : min(min), max(max), diff(diff) {}
};
int n, m, c;
double a[MAXN], x[MAXN], p[MAXN], s[MAXN];
Node node[MAXN];
Node trans(const Node &a, const Node &b) {
  return Node(min(a.min, b.min), max(a.max, b.max),
              max(max(a.diff, b.diff), b.max - a.min));
}
void build(int i, int l, int r) {
  if (l + 1 == r) {
    node[i].diff = -1e10;
    node[i].min = node[i].max = s[l];
  } else {
    int mid = (l + r) >> 1;
    build(i * 2, l, mid);
    build(i * 2 + 1, mid, r);
    node[i] = trans(node[i * 2], node[i * 2 + 1]);
  }
}
Node query(int i, int l, int r, int ql, int qr) {
  if (l >= ql && r <= qr) {
    return node[i];
  } else if (qr <= l || ql >= r) {
    return Node(1e10, -1e10, -1e10);
  } else {
    int mid = (l + r) >> 1;
    Node nl = query(i * 2, l, mid, ql, qr);
    Node nr = query(i * 2 + 1, mid, r, ql, qr);
    return trans(nl, nr);
  }
}
int main() {
  cin >> n >> m >> c;
  for (int i = 1; i <= n; ++i) {
    cin >> x[i];
  }
  for (int i = 1; i < n; ++i) {
    cin >> p[i];
    p[i] /= 100;
    a[i] = (x[i + 1] - x[i]) / 2.0 - p[i] * c;
  }
  s[1] = 0;
  for (int i = 2; i <= n; ++i) {
    s[i] = s[i - 1] + a[i - 1];
  }
  build(1, 1, n + 1);
  double ans = 0;
  for (int i = 1; i <= m; ++i) {
    int a, b;
    cin >> a >> b;
    ans += max(0.0, query(1, 1, n + 1, a, b + 1).diff);
  }
  cout.setf(ios::fixed);
  cout.precision(10);
  cout << ans << endl;
  return 0;
}
