#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T abs(T a) {
  return a > 0 ? a : -a;
}
int n;
int m;
double S[200000];
double ans = 0;
int c;
int x[200000], p[200000];
struct gom {
  double Min, Max, Diff;
};
int K = 1;
gom t[1200000];
gom Gom(gom a, gom b) {
  gom c;
  c.Min = min(a.Min, b.Min);
  c.Max = max(a.Max, b.Max);
  c.Diff = max(a.Diff, b.Diff);
  c.Diff = max(c.Diff, b.Max - a.Min);
  return c;
}
gom rmq(int v, int l, int r, int L, int R) {
  if (l <= L && R <= r) return t[v];
  if (L > r || l > R) {
    gom c;
    c.Min = 1e20;
    c.Max = -1e20;
    c.Diff = -1e20;
    return c;
  }
  return Gom(rmq(2 * v, l, r, L, (L + R) / 2),
             rmq(2 * v + 1, l, r, (L + R) / 2 + 1, R));
}
double brute(int l, int r) {
  double res = 0.0;
  for (int i = l; i <= r; i++) {
    for (int j = i; j <= r; j++) res = max(res, S[j] - S[i]);
  }
  return res;
}
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("%d", p + i + 1);
    p[i + 1] += p[i];
  }
  for (int i = 0; i < (n); i++) {
    S[i] = (double)x[i] / 2.0 - (double)c * (double)p[i] / 100.0;
  }
  while (K < n) K *= 2;
  for (int i = 0; i < (n); i++) {
    t[K + i].Min = t[K + i].Max = S[i];
    t[K + i].Diff = 0.0;
  }
  for (int i = K - 1; i > 0; i--) t[i] = Gom(t[2 * i], t[2 * i + 1]);
  for (int i = 0; i < (m); i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--;
    b--;
    gom res = rmq(1, a, b, 0, K - 1);
    ans += res.Diff;
  }
  printf("%.10lf\n", ans);
  return 0;
}
