#include <bits/stdc++.h>
const bool DEBUG = false;
using namespace std;
const long long maxn = 2e5 + 5;
const long long INF = 4e18;
const long long M = 1e9 + 7;
const int lg = 21;
int n, m;
long double c, ans, x[maxn], l[maxn], t[maxn], p, s[maxn];
struct node {
  long double suf, pre, sum, ans;
};
node A[lg][maxn];
node merge(node A, node B) {
  node C;
  C.pre = max({A.sum + B.pre, A.pre, (long double)0});
  C.suf = max({A.suf + B.sum, B.suf, (long double)0});
  C.sum = A.sum + B.sum;
  C.ans = max({B.ans, A.ans, A.suf + B.pre, (long double)0});
  return C;
}
long double get(int l, int r) {
  if (r < l) return 0;
  int h = r - l + 1;
  node C;
  C.suf = C.sum = C.pre = C.ans = 0;
  for (int i = lg - 1; i >= 0; i--) {
    if ((1 << i) & h) {
      C = merge(C, A[i][l]);
      l = l + (1 << i);
    }
  }
  return C.ans;
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m >> c;
  for (int i = 0; i < n; i++) cin >> x[i];
  for (int i = 0; i < n - 1; i++) l[i] = x[i + 1] - x[i];
  for (int i = 0; i < n - 1; i++) {
    cin >> p;
    s[i] = l[i] / 2 - (p / 100) * c;
  }
  for (int i = 0; i < n - 1; i++) {
    A[0][i].pre = max((long double)0, s[i]);
    A[0][i].suf = max((long double)0, s[i]);
    A[0][i].ans = max((long double)0, s[i]);
    A[0][i].sum = s[i];
  }
  for (int i = 1; i < lg; i++) {
    for (int j = 0; j < n - 1; j++) {
      if ((j + (1 << (i - 1))) <= n - 1)
        A[i][j] = merge(A[i - 1][j], A[i - 1][j + (1 << (i - 1))]);
    }
  }
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    ans = ans + get(x, y - 1);
  }
  cout << fixed << setprecision(10) << ans << endl;
  return 0;
}
