#include <bits/stdc++.h>
int n, m, f, c[150005], p, a, b;
long long A;
struct odp {
  long long L, M, R, S;
  odp() {}
  odp(long long L, long long M, long long R, long long S)
      : L(L), M(M), R(R), S(S) {}
} t[150005 * 4];
void init(int n, int l, int r) {
  if (l == r)
    t[n].L = t[n].R = t[n].M = ((t[n].S = c[l]) > (0) ? (t[n].S = c[l]) : (0));
  else {
    int L = n * 2, R = L + 1, c = l + r >> 1;
    init(L, l, c);
    init(R, c + 1, r);
    t[n].S = t[L].S + t[R].S;
    t[n].L = ((t[L].L) > (t[L].S + t[R].L) ? (t[L].L) : (t[L].S + t[R].L));
    t[n].R = ((t[R].R) > (t[L].R + t[R].S) ? (t[R].R) : (t[L].R + t[R].S));
    t[n].M =
        ((t[L].M) >
                 (((t[R].M) > (t[L].R + t[R].L) ? (t[R].M) : (t[L].R + t[R].L)))
             ? (t[L].M)
             : (((t[R].M) > (t[L].R + t[R].L) ? (t[R].M) : (t[L].R + t[R].L))));
  }
}
odp q(int n, int l, int r) {
  if (l >= a && r <= b) return odp(t[n].L, t[n].M, t[n].R, t[n].S);
  int c = l + r >> 1;
  if (c >= b) return q(n * 2, l, c);
  if (c < a) return q(n * 2 + 1, c + 1, r);
  odp L = q(n * 2, l, c), R = q(n * 2 + 1, c + 1, r);
  return odp(((L.L) > (L.S + R.L) ? (L.L) : (L.S + R.L)),
             ((L.M) > (((R.M) > (L.R + R.L) ? (R.M) : (L.R + R.L)))
                  ? (L.M)
                  : (((R.M) > (L.R + R.L) ? (R.M) : (L.R + R.L)))),
             ((R.R) > (L.R + R.S) ? (R.R) : (L.R + R.S)), L.S + R.S);
}
int main() {
  scanf("%d %d %d", &n, &m, &f);
  for (int i = 1; i <= n; i++)
    scanf("%d", &c[i]), c[i - 1] = (c[i] - c[i - 1]) * 50;
  for (int i = 1; i < n; i++) scanf("%d", &p), c[i] -= p * f;
  init(1, 1, n - 1);
  while (m--) {
    scanf("%d %d", &a, &b);
    b--;
    A += q(1, 1, n - 1).M;
  }
  printf("%.8lf\n", A * 0.01);
}
