#include <bits/stdc++.h>
using namespace std;
const int inf = 1 << 30;
const long long linf = 1LL << 60;
const int maxn = 2 * 100 * 1000 + 5;
const int shft = 1 << 18;
const int maxt = shft << 1;
int X[maxn], L[maxn];
long double M[maxn], P[maxn];
struct trit {
  long double res, l, r, sum;
  trit(long double x) : sum(x) { l = r = res = max(x, (long double)0); }
  trit(long double res, long double l, long double r, long double sum)
      : res(res), l(l), r(r), sum(sum) {}
  trit() : res(0), l(0), r(0), sum(0) {}
};
trit operator+(trit a, trit b) {
  return trit(max(a.r + b.l, max(a.res, b.res)), max(a.l, a.sum + b.l),
              max(b.r, a.r + b.sum), a.sum + b.sum);
}
struct tree {
  trit* T;
  tree() {
    T = new trit[maxt];
    for (int i = 0; i < maxt; ++i) {
      T[i] = trit();
    }
  }
  void upd(int& pos, long double& x, int v = 1, int l = 0, int r = shft - 1) {
    if (l == pos && r == pos) {
      T[v] = trit(x);
      return;
    }
    int c = (l + r) / 2;
    if (pos <= c) {
      upd(pos, x, v * 2, l, c);
    } else {
      upd(pos, x, v * 2 + 1, c + 1, r);
    }
    T[v] = T[v * 2] + T[v * 2 + 1];
  }
  trit sum(int lx, int rx, int v = 1, int l = 0, int r = shft - 1) {
    if (lx > r || rx < l) {
      return trit(0);
    }
    if (lx == l && rx == r) {
      return T[v];
    }
    int c = (l + r) / 2;
    return sum(lx, min(c, rx), v * 2, l, c) +
           sum(max(lx, c + 1), rx, v * 2 + 1, c + 1, r);
  }
};
tree T;
int main() {
  cout.setf(ios::fixed);
  cout.precision(8);
  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];
  }
  for (int i = 0; i < n - 1; ++i) {
    long double prof = (long double)(X[i + 1] - X[i]) / 2 - P[i] * c / 100;
    T.upd(i, prof);
  }
  long double res = 0;
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    res += T.sum(a - 1, b - 2).res;
  }
  cout << res << "\n";
  return 0;
}
