#include <bits/stdc++.h>
const int NMAX = 150000;
const int MMAX = 300000;
int N, M, C;
int cost[NMAX + 1], pp[NMAX + 1];
double pro[NMAX + 1];
double ans;
template <class T>
inline T max(T a, T b) {
  return a > b ? a : b;
}
template <class T>
inline T min(T a, T b) {
  return a < b ? a : b;
}
int allct;
struct s_segtree *all[100], *st;
struct s_segtree {
  s_segtree *lchd, *rchd;
  int l, r;
  double lmax, rmax, mmax, al;
  s_segtree() { lchd = rchd = 0; }
  s_segtree(int ll, int rr, double *inp) {
    l = ll;
    r = rr;
    if (l < r) {
      int m = (l + r) / 2;
      lchd = new s_segtree(l, m, inp);
      rchd = new s_segtree(m + 1, r, inp);
      lmax = 0;
      double sum = 0;
      for (int i = l; i <= r; i++) {
        sum += inp[i];
        if (lmax < sum) {
          lmax = sum;
        }
      }
      rmax = 0;
      sum = 0;
      for (int i = r; i >= l; i--) {
        sum += inp[i];
        if (sum > rmax) {
          rmax = sum;
        }
      }
      mmax =
          max(0.0, max(lchd->mmax, max(rchd->mmax, lchd->rmax + rchd->lmax)));
      al = lchd->al + rchd->al;
    } else {
      lchd = rchd = 0;
      mmax = rmax = lmax = max(inp[l], 0.0);
      al = inp[l];
    }
  }
  ~s_segtree() {
    if (lchd) {
      delete lchd;
      delete rchd;
    }
  }
  void query(int ll, int rr) {
    if (ll == l && rr == r) {
      all[allct++] = this;
    } else {
      int m = (l + r) / 2;
      if (rr <= m) {
        lchd->query(ll, rr);
      } else if (m + 1 <= ll) {
        rchd->query(ll, rr);
      } else {
        lchd->query(ll, m);
        rchd->query(m + 1, rr);
      }
    }
  }
};
int main() {
  int lst, nw;
  scanf("%d %d %d %d", &N, &M, &C, &lst);
  for (int i = 1; i < N; i++) {
    scanf("%d", &nw);
    cost[i] = nw - lst;
    lst = nw;
  }
  for (int i = 1; i < N; i++) {
    scanf("%d", pp + i);
  }
  for (int i = 1; i < N; i++) {
    pro[i] = 0.5 * cost[i] - 0.01 * pp[i] * C;
  }
  st = new s_segtree(1, N, pro);
  ans = 0;
  while (M--) {
    int a, b;
    scanf("%d %d", &a, &b);
    allct = 0;
    st->query(a, b - 1);
    double dmax = 0;
    double s = 0;
    for (int i = 0; i < allct; i++) {
      dmax = max(dmax, all[i]->mmax);
    }
    for (int i = 0; i < allct; i++) {
      double lmax = all[i]->rmax, s = 0;
      for (int j = i + 1; j < allct; j++) {
        double rmax = all[j]->lmax;
        dmax = max(dmax, lmax + s + rmax);
        s += all[j]->al;
      }
    }
    ans += dmax;
  }
  printf("%.9lf\n", ans);
  return 0;
}
