#include <bits/stdc++.h>
using namespace std;
const int maxn = 150001;
const double eps = 1e-8;
int n, m;
double ans, c, x[maxn], p[maxn], v[maxn], d[maxn];
struct point {
  double lmax, rmax, max, sum;
  point() { lmax = rmax = max = sum = 0.0; }
} z[maxn << 2 | 1];
void update(int rt) {
  int l = rt << 1, r = rt << 1 | 1;
  z[rt].sum = z[l].sum + z[r].sum;
  z[rt].lmax = max(z[l].lmax, z[l].sum + z[r].lmax);
  z[rt].rmax = max(z[r].rmax, z[r].sum + z[l].rmax);
  z[rt].max = max(z[l].max, max(z[r].max, z[l].rmax + z[r].lmax));
}
void buildtree(int l, int r, int rt) {
  if (l == r) {
    z[rt].sum = z[rt].lmax = z[rt].rmax = z[rt].max = v[l];
    return;
  }
  int m = (l + r) >> 1;
  buildtree(l, m, rt << 1);
  buildtree(m + 1, r, rt << 1 | 1);
  update(rt);
}
point query(int l, int r, int rt, int nowl, int nowr) {
  if ((nowl <= l) && (r <= nowr)) return z[rt];
  int m = (l + r) >> 1;
  point a, b;
  if (nowl <= m) a = query(l, m, rt << 1, nowl, nowr);
  if (m < nowr) b = query(m + 1, r, rt << 1 | 1, nowl, nowr);
  if ((nowl <= m) && (m < nowr)) {
    point ans;
    ans.sum = a.sum + b.sum;
    ans.lmax = max(a.lmax, a.sum + b.lmax);
    ans.rmax = max(b.rmax, b.sum + a.rmax);
    ans.max = max(a.max, max(b.max, a.rmax + b.lmax));
    return ans;
  } else {
    if (nowl <= m)
      return a;
    else
      return b;
  }
}
int main() {
  scanf("%d%d%lf", &n, &m, &c);
  for (int a = 0; a < n; a++) scanf("%lf", &x[a]);
  for (int a = 1; a < n; a++) scanf("%lf", &p[a]), p[a] /= 100.0;
  for (int a = 1; a < n; a++) d[a] = x[a] - x[a - 1];
  for (int a = 1; a < n; a++)
    if (fabs(c - 1.0) > eps)
      v[a] = d[a] * 0.5 - p[a] * c;
    else
      v[a] = -c;
  buildtree(1, n - 1, 1);
  for (int a = 1; a <= m; a++) {
    int l, r;
    scanf("%d%d", &l, &r);
    ans += max(0.0, query(1, n - 1, 1, l, r - 1).max);
  }
  printf("%lf\n", ans);
  return 0;
}
