#include <bits/stdc++.h>
using namespace std;
struct Node {
  int l, r;
  long long val, mval, lval, rval;
} a[600010];
int n, m, c, x[150010], p[150010];
long long ans;
void make_SegmentTree(int k, int l, int r) {
  a[k].l = l;
  a[k].r = r;
  if (l == r) {
    a[k].val = 100 * x[l] - 2 * c * p[l];
    if (a[k].val < 0)
      a[k].mval = a[k].lval = a[k].rval = 0;
    else
      a[k].mval = a[k].lval = a[k].rval = a[k].val;
  } else {
    make_SegmentTree(k * 2, l, (l + r) / 2);
    make_SegmentTree(k * 2 + 1, (l + r) / 2 + 1, r);
    a[k].val = a[k * 2].val + a[k * 2 + 1].val;
    a[k].mval = a[k].lval = a[k].rval = 0;
    if (a[k].mval < a[k * 2].mval) a[k].mval = a[k * 2].mval;
    if (a[k].mval < a[k * 2 + 1].mval) a[k].mval = a[k * 2 + 1].mval;
    if (a[k].mval < a[k * 2].rval + a[k * 2 + 1].lval)
      a[k].mval = a[k * 2].rval + a[k * 2 + 1].lval;
    if (a[k].lval < a[k * 2].lval) a[k].lval = a[k * 2].lval;
    if (a[k].lval < a[k * 2].val + a[k * 2 + 1].lval)
      a[k].lval = a[k * 2].val + a[k * 2 + 1].lval;
    if (a[k].rval < a[k * 2 + 1].rval) a[k].rval = a[k * 2 + 1].rval;
    if (a[k].rval < a[k * 2 + 1].val + a[k * 2].rval)
      a[k].rval = a[k * 2 + 1].val + a[k * 2].rval;
  }
}
long long Max(long long p, long long q) { return (p > q) ? p : q; }
void calcRight(int k, int x, long long &z1, long long &z2) {
  if (a[k].l == x) {
    z1 = a[k].rval;
    z2 = a[k].mval;
    return;
  }
  if (a[k * 2 + 1].l <= x) {
    calcRight(k * 2 + 1, x, z1, z2);
    return;
  }
  long long z3, z4;
  calcRight(k * 2, x, z3, z4);
  z1 = Max(a[k * 2 + 1].rval, a[k * 2 + 1].val + z3);
  z2 = a[k * 2 + 1].mval;
  if (z2 < z4) z2 = z4;
  if (z2 < z3 + a[k * 2 + 1].lval) z2 = z3 + a[k * 2 + 1].lval;
}
void calcLeft(int k, int x, long long &z1, long long &z2) {
  if (a[k].r == x) {
    z1 = a[k].lval;
    z2 = a[k].mval;
    return;
  }
  if (a[k * 2].r >= x) {
    calcLeft(k * 2, x, z1, z2);
    return;
  }
  long long z3, z4;
  calcLeft(k * 2 + 1, x, z3, z4);
  z1 = Max(a[k * 2].lval, a[k * 2].val + z3);
  z2 = a[k * 2].mval;
  if (z2 < z4) z2 = z4;
  if (z2 < z3 + a[k * 2].rval) z2 = z3 + a[k * 2].rval;
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= n; i++) scanf("%d", &x[i]);
  for (int i = 1; i < n; i++) x[i] = x[i + 1] - x[i];
  for (int i = 1; i < n; i++) scanf("%d", &p[i]);
  make_SegmentTree(1, 1, n - 1);
  ans = 0;
  for (int i = 1; i <= m; i++) {
    int x, y, k = 1;
    scanf("%d%d", &x, &y);
    y--;
    while (!(a[k].l == x && a[k].r == y) &&
           (a[k * 2].r >= y || a[k * 2 + 1].l <= x))
      if (a[k * 2].r >= y)
        k = k * 2;
      else
        k = k * 2 + 1;
    long long z;
    if (a[k].l == x && a[k].r == y)
      z = a[k].mval;
    else {
      long long z1, z2, z3, z4;
      calcRight(k * 2, x, z1, z2);
      calcLeft(k * 2 + 1, y, z3, z4);
      z = z1 + z3;
      if (z < z2) z = z2;
      if (z < z4) z = z4;
    }
    ans += z;
  }
  double xx = ans / 200.0;
  printf("%.6lf\n", xx);
  return 0;
}
