#include <bits/stdc++.h>
using namespace std;
struct mydata {
  int left;
  int right;
  double _mid;
  double _left;
  double _right;
  double _total;
  int calmid() { return (left + right) / 2; }
} Stree[700000];
double a[200000];
double x[200000];
double p[200000];
void build(int left, int right, int index) {
  Stree[index].left = left;
  Stree[index].right = right;
  if (left == right) {
    Stree[index]._left = Stree[index]._mid = Stree[index]._right =
        Stree[index]._total = a[left];
    return;
  }
  int mid = Stree[index].calmid();
  build(left, mid, index << 1);
  build(mid + 1, right, (index << 1) + 1);
  Stree[index]._total =
      Stree[index << 1]._total + Stree[(index << 1) + 1]._total;
  Stree[index]._mid =
      max(Stree[index << 1]._right + Stree[(index << 1) + 1]._left,
          max(Stree[index << 1]._mid, Stree[(index << 1) + 1]._mid));
  Stree[index]._left =
      max(Stree[index << 1]._left,
          Stree[index << 1]._total + Stree[(index << 1) + 1]._left);
  Stree[index]._right =
      max(Stree[(index << 1) + 1]._right,
          Stree[index << 1]._right + Stree[(index << 1) + 1]._total);
}
double querytotal(int left, int right, int index) {
  if (Stree[index].left >= left && Stree[index].right <= right) {
    return Stree[index]._total;
  }
  int mid = Stree[index].calmid();
  if (left > mid)
    return querytotal(left, right, (index << 1) + 1);
  else if (right <= mid)
    return querytotal(left, right, index << 1);
  return querytotal(left, mid, index << 1) +
         querytotal(mid + 1, right, (index << 1) + 1);
}
double queryleft(int left, int right, int index) {
  if (Stree[index].left >= left && Stree[index].right <= right) {
    return Stree[index]._left;
  }
  int mid = Stree[index].calmid();
  if (left > mid)
    return queryleft(left, right, (index << 1) + 1);
  else if (right <= mid)
    return queryleft(left, right, index << 1);
  else
    return max(queryleft(left, mid, index << 1),
               queryleft(mid + 1, right, (index << 1) + 1) +
                   querytotal(left, mid, index << 1));
}
double queryright(int left, int right, int index) {
  if (Stree[index].left >= left && Stree[index].right <= right) {
    return Stree[index]._right;
  }
  int mid = Stree[index].calmid();
  if (left > mid)
    return queryright(left, right, (index << 1) + 1);
  else if (right <= mid)
    return queryright(left, right, index << 1);
  else
    return max(queryright(mid + 1, right, (index << 1) + 1),
               queryright(left, mid, index << 1) +
                   querytotal(mid + 1, right, (index << 1) + 1));
}
double querymid(int left, int right, int index) {
  if (left > right) return 0;
  if (Stree[index].left >= left && Stree[index].right <= right) {
    return Stree[index]._mid;
  }
  int mid = Stree[index].calmid();
  if (left > mid)
    return querymid(left, right, (index << 1) + 1);
  else if (right <= mid)
    return querymid(left, right, index << 1);
  else {
    double ret = max(querymid(left, mid, index << 1),
                     querymid(mid + 1, right, (index << 1) + 1));
    return max(ret, queryright(left, mid, index << 1) +
                        queryleft(mid + 1, right, (index << 1) + 1));
  }
}
int main() {
  int n, m;
  double c;
  int i;
  cin >> n >> m >> c;
  for (i = 1; i <= n; i++) {
    cin >> x[i];
  }
  for (i = 1; i < n; i++) {
    cin >> p[i];
    a[i] = 0 - p[i] * c + (x[i + 1] - x[i]) * 50;
  }
  build(1, n - 1, 1);
  double ret = 0;
  for (i = 0; i < m; i++) {
    int aa, b;
    cin >> aa >> b;
    double t = max(0.0, querymid(aa, b - 1, 1));
    ret += t;
  }
  printf("%.12lf\n", ret / 100);
  return 0;
}
