#include <bits/stdc++.h>
using namespace std;
struct tt {
  double minn, maxx, res;
} p[600000];
int cnt[200000];
double d[200000], pro[200000], val[200000];
tt un(tt aa, tt bb) {
  tt ret;
  ret.maxx = max(aa.maxx, bb.maxx);
  ret.minn = min(aa.minn, bb.minn);
  ret.res = max(max(aa.res, bb.res), bb.maxx - aa.minn);
  return ret;
}
void build(int s, int e, int num) {
  if (s - e) {
    int m = (s + e) >> 1;
    build(s, m, num * 2 + 1);
    build(m + 1, e, num * 2 + 2);
    p[num] = un(p[num * 2 + 1], p[num * 2 + 2]);
  } else {
    p[num].maxx = p[num].minn = val[s];
    p[num].res = 0;
  }
}
tt query(int s, int e, int ll, int rr, int num) {
  if (s == ll && e == rr) return p[num];
  int m = (ll + rr) >> 1;
  if (m >= e)
    return query(s, e, ll, m, num * 2 + 1);
  else if (m < s)
    return query(s, e, m + 1, rr, num * 2 + 2);
  else
    return un(query(s, m, ll, m, num * 2 + 1),
              query(m + 1, e, m + 1, rr, num * 2 + 2));
}
int main() {
  int i, j, n, m, a, b;
  double c, ans;
  while (scanf("%d %d %lf", &n, &m, &c) != EOF) {
    ans = 0;
    memset(cnt, 0, sizeof(cnt));
    for (i = 0; i < n; ++i) scanf("%lf", &d[i]);
    val[0] = 0;
    for (i = 1; i < n; ++i) {
      scanf("%lf", &pro[i]);
      pro[i] /= 100.;
      val[i] = val[i - 1] + (d[i] - d[i - 1]) * 0.5 - c * pro[i];
    }
    build(0, n - 1, 0);
    for (i = 0; i < m; ++i) {
      scanf("%d %d", &a, &b);
      ans += query(a - 1, b - 1, 0, n - 1, 0).res;
    }
    printf("%.10lf\n", ans);
  }
  return 0;
}
