#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
double P[1 << 20];
double X[1 << 20];
double c;
double mn[1 << 20], mx[1 << 20], w[1 << 20];
int BASE;
void build() {
  for (int i = BASE; i < 2 * BASE; ++i) {
    mn[i] = mx[i] = X[i - BASE] * 0.5 - c * P[i - BASE];
    w[i] = 0;
  }
  for (int i = BASE - 1; i > 0; --i) {
    mn[i] = min(mn[i * 2], mn[i * 2 + 1]);
    mx[i] = max(mx[i * 2], mx[i * 2 + 1]);
    w[i] = max(max(w[i * 2], w[i * 2 + 1]), mx[i * 2 + 1] - mn[i * 2]);
  }
}
struct wyn {
  double mn, mx, best;
};
wyn get(int a, int b, int x, int y, int p) {
  wyn res;
  if (a == x && b == y) {
    res.mn = mn[p];
    res.mx = mx[p];
    res.best = w[p];
    return res;
  }
  int mid = (x + y) / 2;
  if (b <= mid)
    return get(a, b, x, mid, 2 * p);
  else if (a > mid)
    return get(a, b, mid + 1, y, 2 * p + 1);
  else {
    wyn e = get(a, mid, x, mid, 2 * p);
    wyn f = get(mid + 1, b, mid + 1, y, 2 * p + 1);
    res.mn = min(e.mn, f.mn);
    res.mx = max(e.mx, f.mx);
    res.best = max(max(e.best, f.best), f.mx - e.mn);
  }
  return res;
}
int main(void) {
  int n, m;
  scanf("%d%d%lf", &n, &m, &c);
  for (int i = 0; i < (n); ++i) scanf("%lf", &X[i]);
  P[0] = 0.0;
  for (int i = (1); i < (n); ++i) {
    scanf("%lf", &P[i]);
    P[i] = 0.01 * P[i];
    P[i] += P[i - 1];
  }
  for (BASE = 1; BASE < n; BASE <<= 1)
    ;
  for (int i = n; i < BASE; ++i) {
    P[i] = P[n - 1];
    X[i] = X[n - 1];
  }
  build();
  double res = 0.0;
  for (int i = 0; i < (m); ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a;
    --b;
    res += get(a, b, 0, BASE - 1, 1).best;
  }
  printf("%.10lf\n", res);
  return 0;
}
