#include <bits/stdc++.h>
using namespace std;
int N, M, C;
int X[160000];
double P;
struct Node {
  double lmx, rmx, sum, val;
  Node() {}
  Node(double lmx, double rmx, double sum, double val)
      : lmx(lmx), rmx(rmx), sum(sum), val(val) {}
};
Node mc(Node n1, Node n2) {
  if (n1.lmx < -1) return n2;
  if (n2.lmx < -1) return n1;
  Node res;
  res.lmx = max(n1.lmx, n1.sum + n2.lmx);
  res.rmx = max(n1.rmx + n2.sum, n2.rmx);
  res.sum = n1.sum + n2.sum;
  res.val = max(max(n1.val, n2.val), n1.rmx + n2.lmx);
  return res;
}
const int n = 1 << 18;
Node dat[n * 2 - 1];
Node query(int a, int b, int k, int l, int r) {
  if (r <= a || b <= l) return Node(-111, 0, 0, 0);
  if (a <= l && r <= b) return dat[k];
  return mc(query(a, b, k * 2 + 1, l, (l + r) / 2),
            query(a, b, k * 2 + 2, (l + r) / 2, r));
}
int main() {
  scanf("%d%d%d", &N, &M, &C);
  for (int(i) = 0; (i) < (N); (i)++) scanf("%d", &X[i]);
  for (int(i) = 0; (i) < (N - 1); (i)++) {
    scanf("%lf", &P), P /= 100;
    P = 1.0 - P;
    double rr = double(X[i + 1] - X[i]) / 2 - (1.0 - P) * C;
    dat[n - 1 + i] = Node(max(rr, 0.0), max(rr, 0.0), rr, max(rr, 0.0));
  }
  double res = 0.0;
  for (int i = n - 2; i >= 0; i--) dat[i] = mc(dat[i * 2 + 1], dat[i * 2 + 2]);
  while (M--) {
    scanf("%d%d", &N, &C);
    N--;
    C--;
    res += query(N, C, 0, 0, n).val;
  }
  printf("%.12f\n", res);
}
