#include <bits/stdc++.h>
using namespace std;
int A[200009], val[200009];
double prob[200009];
struct st_nodo {
  double todo;
  double izq;
  double der;
  double mid;
  st_nodo() {}
  st_nodo(double _todo, double _izq, double _der, double _mid) {
    todo = _todo;
    izq = _izq;
    der = _der;
    mid = _mid;
  }
} T[200009 * 4];
st_nodo INF(-10000000000000000.0, -10000000000000000.0, -10000000000000000.0,
            -10000000000000000.0);
void ini(int le, int ri, int nodo) {
  if (le == ri) {
    T[nodo].todo = T[nodo].izq = T[nodo].der = T[nodo].mid = prob[le];
    return;
  }
  int mid = (le + ri) / 2, hijo_izq = 2 * nodo + 1, hijo_der = 2 * nodo + 2;
  ini(le, mid, hijo_izq);
  ini(mid + 1, ri, hijo_der);
  T[nodo].todo = T[hijo_izq].todo + T[hijo_der].todo;
  T[nodo].izq = max(max(T[hijo_izq].izq, T[nodo].todo),
                    T[hijo_izq].todo + T[hijo_der].izq);
  T[nodo].der = max(max(T[hijo_der].der, T[nodo].todo),
                    T[hijo_izq].der + T[hijo_der].todo);
  T[nodo].mid = max(T[hijo_izq].der + T[hijo_der].izq, T[nodo].todo);
  T[nodo].mid = max(T[nodo].mid, T[hijo_der].mid);
  T[nodo].mid = max(T[nodo].mid, T[hijo_izq].mid);
}
st_nodo query(int le, int ri, int nodo, int a, int b) {
  if (b < le || ri < a) return INF;
  if (a <= le && ri <= b) return T[nodo];
  int mid = (le + ri) / 2, hijo_izq = 2 * nodo + 1, hijo_der = 2 * nodo + 2;
  st_nodo no_izq = query(le, mid, hijo_izq, a, b);
  st_nodo no_der = query(mid + 1, ri, hijo_der, a, b);
  st_nodo ans;
  ans.todo = no_izq.todo + no_der.todo;
  ans.izq = max(max(no_izq.izq, ans.todo), no_izq.todo + no_der.izq);
  ans.der = max(max(no_der.der, ans.todo), no_der.todo + no_izq.der);
  ans.mid = max(no_der.izq + no_izq.der, ans.todo);
  ans.mid = max(ans.mid, no_der.mid);
  ans.mid = max(ans.mid, no_izq.mid);
  return ans;
}
int main() {
  int n, x, m, c, y;
  cin >> n >> m >> c;
  for (int i = 0; i < n; i++) {
    scanf("%d", &A[i]);
    if (i != 0) val[i - 1] = A[i] - A[i - 1];
  }
  for (int i = 0; i < n - 1; i++) {
    scanf("%d", &x);
    double proba = (double)x / 100.0;
    prob[i] = ((((double)val[i] / 2.0) - c) * proba) +
              ((double)val[i] / 2.0) * (1 - proba);
  }
  ini(0, n - 2, 0);
  double ans = 0.0;
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &x, &y);
    x--, y--, y--;
    st_nodo n1 = query(0, n - 2, 0, x, y);
    double maxi = 0.0;
    maxi = max(maxi, n1.todo);
    maxi = max(maxi, n1.izq);
    maxi = max(maxi, n1.der);
    maxi = max(maxi, n1.mid);
    ans += maxi;
  }
  printf("%.8f\n", ans);
  return 0;
}
