#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 7;
struct node {
  int l, r;
  double x, maxl, maxr, maxsum, sum;
  node(){};
} t[maxn * 4];
int n, m, c, pos[maxn], l[maxn], r[maxn], p[maxn];
double ans, a[maxn];
void build(int x, int l, int r) {
  t[x].l = l, t[x].r = r;
  if (l == r) {
    t[x].sum = a[l];
    t[x].maxl = t[x].maxr = t[x].maxsum = max(0., a[l]);
    return;
  }
  int mid = (l + r) / 2;
  build(x << 1, l, mid);
  build(x << 1 | 1, mid + 1, r);
  t[x].maxl = max(t[x << 1].maxl, t[x << 1].sum + t[x << 1 | 1].maxl);
  t[x].maxr = max(t[x << 1 | 1].maxr, t[x << 1].maxr + t[x << 1 | 1].sum);
  t[x].sum = t[x << 1].sum + t[x << 1 | 1].sum;
  t[x].maxsum = max(t[x << 1].maxsum, t[x << 1 | 1].maxsum);
  t[x].maxsum = max(t[x << 1].maxr + t[x << 1 | 1].maxl, t[x].maxsum);
}
node query(int x, int ql, int qr) {
  int l = t[x].l, r = t[x].r;
  if (ql <= l && qr >= r) {
    return t[x];
  }
  int mid = (l + r) / 2;
  if (qr <= mid) {
    return query(x << 1, ql, qr);
  }
  if (ql > mid) {
    return query(x << 1 | 1, ql, qr);
  }
  node ll = query(x << 1, ql, qr);
  node rr = query(x << 1 | 1, ql, qr);
  node ans;
  ans.sum = ll.sum + rr.sum;
  ans.maxl = max(ll.maxl, ll.sum + rr.maxl);
  ans.maxr = max(rr.maxr, ll.maxr + rr.sum);
  ans.maxsum = max(ll.maxsum, rr.maxsum);
  ans.maxsum = max(ans.maxsum, ll.maxr + rr.maxl);
  return ans;
}
int main() {
  scanf("%d %d %d", &n, &m, &c);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &pos[i]);
  }
  for (int i = 1; i < n; i++) {
    scanf("%d", &p[i]);
  }
  for (int i = 1; i < n; i++) {
    a[i] = (pos[i + 1] - pos[i]) * 0.5 - p[i] * 0.01 * c;
  }
  double res = 0;
  build(1, 1, n - 1);
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &l[i], &r[i]);
    node ans = query(1, l[i], r[i] - 1);
    res += ans.maxsum;
  }
  printf("%.6f\n", res);
  return 0;
}
