#include <bits/stdc++.h>
using namespace std;
struct Data {
  double sum, lmax, rmax, imax;
  Data() {}
  Data(double x) { sum = lmax = rmax = imax = x; }
};
Data concat(const Data &a, const Data &b) {
  Data res(0.0);
  res.sum = a.sum + b.sum;
  res.lmax = max(a.lmax, a.sum + b.lmax);
  res.rmax = max(b.rmax, b.sum + a.rmax);
  res.imax = max(max(a.imax, b.imax), a.rmax + b.lmax);
  return res;
}
const int STsize = 1 << 22;
struct SegTree {
  Data data[STsize];
  int n;
  void init() {
    n = STsize / 2;
    for (int i = 0; i < (int)(STsize); ++i) data[i] = Data(0.0);
  }
  void update(int pos, const double &value) {
    data[pos] = Data(value);
    while (pos < 2 * n - 1) {
      int lpos = pos, rpos = pos ^ 1;
      if (lpos & 1) {
        swap(lpos, rpos);
      }
      data[pos / 2 + n] = concat(data[lpos], data[rpos]);
      pos = pos / 2 + n;
    }
  }
  Data sub(int fr, int to, int node, int la, int ra) {
    if (ra <= fr || to <= la) return Data(0.0);
    if (fr <= la && ra <= to) return data[node];
    Data vl = sub(fr, to, (node - n) * 2 + 0, la, (la + ra) / 2);
    Data vr = sub(fr, to, (node - n) * 2 + 1, (la + ra) / 2, ra);
    return concat(vl, vr);
  }
  double query(int fr, int to) { return sub(fr, to, 2 * n - 2, 0, n).imax; }
};
SegTree sss;
double vd[150020], vp[150020];
int main() {
  int N, M;
  double C;
  while (cin >> N >> M >> C) {
    for (int i = 0; i < (int)(N); ++i) scanf("%lf", vd + i);
    for (int i = 0; i < (int)(N - 1); ++i) {
      scanf("%lf", vp + i);
      vp[i] /= 100.0;
    }
    sss.init();
    for (int i = 0; i < (int)(N - 1); ++i) {
      double val = (vd[i + 1] - vd[i]) / 2.0 - vp[i] * C;
      sss.update(i, val);
    }
    double res = 0.0;
    for (int i = 0; i < (int)(M); ++i) {
      int a, b;
      scanf("%d%d", &a, &b);
      res += sss.query(a - 1, b - 1);
    }
    printf("%.12f\n", res);
  }
}
