#include <bits/stdc++.h>
using namespace std;
int N, M, C, P;
int X[200000], Pr[200000];
long double Sum[1000000], Left[1000000], Right[1000000], Best[1000000];
void push(int idx, long double earn) {
  idx += P;
  Sum[idx] = earn;
  Best[idx] = Left[idx] = Right[idx] = max((long double)0.0, earn);
  while (idx > 1) {
    idx /= 2;
    Sum[idx] = Sum[idx * 2] + Sum[idx * 2 + 1];
    Right[idx] = max(Right[idx * 2 + 1], Right[idx * 2] + Sum[idx * 2 + 1]);
    Left[idx] = max(Left[idx * 2], Left[idx * 2 + 1] + Sum[idx * 2]);
    Best[idx] = max(Best[idx * 2], Best[idx * 2 + 1]);
    Best[idx] = max(Best[idx], Right[idx * 2] + Left[idx * 2 + 1]);
  }
}
long double find(int a, int b) {
  a += P, b += P;
  if (a > b) return 0.0;
  long double res = max(Right[a], Left[b]);
  if (a == b) return res;
  long double right = Right[a], left = Left[b];
  while (a < b - 1) {
    if (a % 2 == 0) {
      res = max(res, Best[a + 1]);
      res = max(res, right + Left[a + 1]);
      right = max(right + Sum[a + 1], Right[a + 1]);
    }
    if (b % 2 == 1) {
      res = max(res, Best[b - 1]);
      res = max(res, left + Right[b - 1]);
      left = max(left + Sum[b - 1], Left[b - 1]);
    }
    a /= 2, b /= 2;
  }
  res = max(res, left + right);
  return res;
}
int main() {
  int i, a, b;
  scanf("%d%d%d", &N, &M, &C);
  for (i = 0; i < (int)(N); i++) scanf("%d", &X[i]);
  for (i = 0; i < (int)(N - 1); i++) scanf("%d", &Pr[i]);
  P = 1;
  while (P < N - 1) P *= 2;
  for (i = P * 2 - 1; i >= 0; i--) Sum[i] = Left[i] = Right[i] = Best[i] = 0.0;
  for (i = 0; i < (int)(N - 1); i++) {
    push(i,
         (X[i + 1] - X[i]) / (long double)2.0 - C * Pr[i] / (long double)100.0);
  }
  long double sum = 0.0;
  for (i = 0; i < (int)(M); i++) {
    scanf("%d%d", &a, &b);
    sum += find(a - 1, b - 2);
  }
  cout << fixed << setprecision(15) << sum << endl;
  return 0;
}
