#include <bits/stdc++.h>
using namespace std;
int n, m, c;
struct node {
  int l, r;
  double lm, rm, mm, sm;
  bool ll, rr;
} tr[1000000];
double f[200000];
int dis[200000], pro[200000];
void build(int n, int l, int r) {
  tr[n].l = l;
  tr[n].r = r;
  if (l == r) {
    tr[n].lm = f[l];
    tr[n].rm = f[l];
    tr[n].mm = f[l];
    tr[n].sm = f[l];
    tr[n].ll = 1;
    tr[n].rr = 1;
    return;
  }
  int m = l + r >> 1;
  build(n << 1, l, m);
  build(n << 1 | 1, m + 1, r);
  tr[n].sm = tr[n << 1].sm + tr[n << 1 | 1].sm;
  tr[n].lm = -1e100;
  tr[n].lm = tr[n << 1].sm + tr[n << 1 | 1].lm;
  tr[n].ll = tr[n << 1 | 1].ll;
  if (tr[n << 1].lm > tr[n].lm) {
    tr[n].lm = tr[n << 1].lm;
    tr[n].ll = 0;
  }
  tr[n].rm = -1e100;
  tr[n].rm = tr[n << 1].rm + tr[n << 1 | 1].sm;
  tr[n].rr = tr[n << 1].rr;
  if (tr[n << 1 | 1].rm > tr[n].rm) {
    tr[n].rm = tr[n << 1 | 1].rm;
    tr[n].rr = 0;
  }
  tr[n].mm = max(tr[n << 1].mm, tr[n << 1 | 1].mm);
  tr[n].mm = max(tr[n << 1].rm + tr[n << 1 | 1].lm, tr[n].mm);
}
double query(int n, int l, int r, int t) {
  if (l == tr[n].l && tr[n].r == r) {
    if (t == 0) return tr[n].mm;
    if (t == 1) return tr[n].rm;
    if (t == 2) return tr[n].lm;
  }
  if (t == 0) {
    int m = tr[n].l + tr[n].r >> 1;
    if (r <= m)
      return query(n << 1, l, r, 0);
    else if (m + 1 <= l)
      return query(n << 1 | 1, l, r, 0);
    else {
      double ans = max(query(n << 1, l, m, 0), query(n << 1 | 1, m + 1, r, 0));
      return max(ans, query(n << 1, l, m, 1) + query(n << 1 | 1, m + 1, r, 2));
    }
  }
  if (t == 1) {
    int m = tr[n].l + tr[n].r >> 1;
    if (l >= m + 1)
      return query(n << 1 | 1, l, r, 1);
    else
      return max(query(n << 1 | 1, m + 1, r, 1),
                 query(n << 1, l, m, 1) + tr[n << 1 | 1].sm);
  }
  if (t == 2) {
    int m = tr[n].l + tr[n].r >> 1;
    if (r <= m)
      return query(n << 1, l, r, 2);
    else
      return max(query(n << 1, l, m, 2),
                 query(n << 1 | 1, m + 1, r, 2) + tr[n << 1].sm);
  }
}
int main() {
  while (~scanf("%d%d%d", &n, &m, &c)) {
    for (int i = 1; i <= n; i++) scanf("%d", dis + i);
    for (int i = 1; i <= n - 1; i++) scanf("%d", pro + i);
    for (int i = 1; i <= n - 1; i++)
      f[i] = (dis[i + 1] - dis[i]) * 0.5 - 1.0 * pro[i] / 100 * c;
    build(1, 1, n - 1);
    double ans = 0;
    for (int i = 1; i <= m; i++) {
      int a, b;
      scanf("%d%d", &a, &b);
      ans += max(0.0, query(1, a, b - 1, 0));
    }
    printf("%.10f\n", ans);
  }
}
