#include <bits/stdc++.h>
using namespace std;
struct Nod {
  int l, r;
  double maxL, maxR, sum, Max;
} T[155555 << 2];
int N, M;
double C;
double x[155555], p[155555], a[155555];
void pushUp(int rt) {
  T[rt].sum = T[((rt) << 1)].sum + T[(((rt) << 1) | 1)].sum;
  T[rt].maxL =
      max(T[((rt) << 1)].maxL, T[((rt) << 1)].sum + T[(((rt) << 1) | 1)].maxL);
  T[rt].maxR = max(T[(((rt) << 1) | 1)].maxR,
                   T[((rt) << 1)].maxR + T[(((rt) << 1) | 1)].sum);
  T[rt].Max = max(max(T[((rt) << 1)].Max, T[(((rt) << 1) | 1)].Max),
                  T[((rt) << 1)].maxR + T[(((rt) << 1) | 1)].maxL);
}
void build(int l, int r, int rt) {
  T[rt].l = l;
  T[rt].r = r;
  if (l == r) {
    T[rt].sum = a[r];
    T[rt].Max = max(0.0, a[r]);
    T[rt].maxL = T[rt].maxR = T[rt].Max;
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, ((rt) << 1));
  build(mid + 1, r, (((rt) << 1) | 1));
  pushUp(rt);
}
Nod query(int L, int R, int rt) {
  if (L <= T[rt].l && T[rt].r <= R) {
    return T[rt];
  }
  int mid = (T[rt].l + T[rt].r) >> 1;
  if (R <= mid)
    return query(L, R, ((rt) << 1));
  else if (L > mid)
    return query(L, R, (((rt) << 1) | 1));
  else {
    Nod ll = query(L, mid, ((rt) << 1));
    Nod rr = query(mid + 1, R, (((rt) << 1) | 1));
    Nod tmp;
    tmp.sum = ll.sum + rr.sum;
    tmp.maxL = max(ll.maxL, ll.sum + rr.maxL);
    tmp.maxR = max(rr.maxR, rr.sum + ll.maxR);
    tmp.Max = max(max(ll.Max, rr.Max), ll.maxR + rr.maxL);
    return tmp;
  }
}
int main() {
  cin >> N >> M >> C;
  for (int i = 0; i < N; i++) {
    cin >> x[i];
  }
  for (int i = 1; i < N; i++) {
    cin >> p[i];
    a[i] = (x[i] - x[i - 1]) * 0.5 - C * p[i] / 100.0;
  }
  build(1, N - 1, 1);
  double ret = 0.0;
  while (M--) {
    int x, y;
    cin >> x >> y;
    double tmp = query(x, y - 1, 1).Max;
    if (tmp > 0) ret += tmp;
  }
  printf("%.8lf\n", ret);
  return 0;
}
