#include <bits/stdc++.h>
using namespace std;
inline long long rd() {
  long long x = 0;
  int ch = getchar(), f = 1;
  while (!isdigit(ch) && (ch != '-') && (ch != EOF)) ch = getchar();
  if (ch == '-') {
    f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline void rt(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10)
    rt(x / 10), putchar(x % 10 + '0');
  else
    putchar(x + '0');
}
const int maxn = 150005;
int n, m, c;
long long x[maxn];
struct submax {
  long long lm, rm, mm, sum;
  submax(long long LM = 0, long long RM = 0, long long MM = 0,
         long long SUM = 0) {
    lm = LM, rm = RM, mm = MM, sum = SUM;
  }
} a[maxn << 2], tmp;
void build(int i, int l, int r) {
  if (l == r) {
    a[i].lm = a[i].rm = a[i].mm = a[i].sum = x[l];
    a[i].mm = max(a[i].mm, 0ll);
    return;
  }
  int mid = l + r >> 1;
  build((i << 1), l, mid), build((i << 1 | 1), mid + 1, r);
  a[i].lm = max(a[(i << 1)].lm, a[(i << 1)].sum + a[(i << 1 | 1)].lm);
  a[i].rm = max(a[(i << 1 | 1)].rm, a[(i << 1 | 1)].sum + a[(i << 1)].rm);
  a[i].mm = max(max(a[(i << 1)].mm, a[(i << 1)].rm + a[(i << 1 | 1)].lm),
                a[(i << 1 | 1)].mm);
  a[i].sum = a[(i << 1)].sum + a[(i << 1 | 1)].sum;
}
submax query(int i, int l, int r, int first, int bh) {
  if (l == first && r == bh) return submax(a[i].lm, a[i].rm, a[i].mm, a[i].sum);
  int mid = l + r >> 1;
  if (bh <= mid)
    return query((i << 1), l, mid, first, bh);
  else if (first > mid)
    return query((i << 1 | 1), mid + 1, r, first, bh);
  else {
    submax lx = query((i << 1), l, mid, first, mid),
           rx = query((i << 1 | 1), mid + 1, r, mid + 1, bh), t;
    t.lm = max(lx.lm, lx.sum + rx.lm);
    t.rm = max(rx.rm, rx.sum + lx.rm);
    t.sum = lx.sum + rx.sum;
    t.mm = max(max(lx.mm, lx.rm + rx.lm), rx.mm);
    return t;
  }
}
int main() {
  n = rd() - 1, m = rd(), c = rd();
  int lst = rd(), now, p;
  for (int i = 1; i <= (int)n; i++)
    now = rd(), x[i] = (long long)(now - lst) * 50, lst = now;
  for (int i = 1; i <= (int)n; i++) now = rd(), x[i] -= now * c;
  build(1, 1, n);
  long long ans = 0;
  for (int i = 1; i <= (int)m; i++) {
    int l = rd(), r = rd() - 1;
    ans += query(1, 1, n, l, r).mm;
  }
  printf("%.10lf\n", ans / 100.0);
}
