#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
const int N = 151000;
int n, m, c, l, r, x[N], p[N];
double e[N], ans;
struct info {
  double sm, lm, rm, am;
  info() {}
  info(double c) {
    sm = c;
    lm = rm = am = max(c, 0.);
  }
  info(double sm, double lm, double rm, double am)
      : sm(sm), lm(lm), rm(rm), am(am) {}
} nd[4 * N];
info operator+(const info &a, const info &b) {
  return info(a.sm + b.sm, max(a.lm, a.sm + b.lm), max(b.rm, b.sm + a.rm),
              max(max(a.am, b.am), a.rm + b.lm));
}
void build(int p, int l, int r) {
  if (l == r)
    nd[p] = info(e[l]);
  else {
    int md = (l + r) >> 1;
    build(p + p, l, md);
    build(p + p + 1, md + 1, r);
    nd[p] = nd[p + p] + nd[p + p + 1];
  }
}
info query(int p, int l, int r, int tl, int tr) {
  if (l == tl && r == tr)
    return nd[p];
  else {
    int md = (l + r) >> 1;
    if (tr <= md)
      return query(p + p, l, md, tl, tr);
    else if (tl > md)
      return query(p + p + 1, md + 1, r, tl, tr);
    else
      return query(p + p, l, md, tl, md) +
             query(p + p + 1, md + 1, r, md + 1, tr);
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 0; i < n; i++) scanf("%d", x + i);
  for (int i = 1; i < n; i++) scanf("%d", p + i);
  for (int i = 1; i < n; i++) e[i] = 0.5 * (x[i] - x[i - 1]) - 0.01 * p[i] * c;
  build(1, 1, n - 1);
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &l, &r);
    ans += query(1, 1, n - 1, l, r - 1).am;
  }
  printf("%.10f\n", ans);
}
