#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
struct p {
  int l, r, lpos, rpos, lk, rk;
  double sum, key, lkey, rkey;
} arr[4 * N];
double a[N];
void up(int c) {
  arr[c].key = arr[c + c].key;
  arr[c].lk = arr[c + c].lk;
  arr[c].rk = arr[c + c].rk;
  if (arr[c].key < arr[c + c].rkey + arr[c + c + 1].lkey) {
    arr[c].key = arr[c + c].rkey + arr[c + c + 1].lkey;
    arr[c].lk = arr[c + c].rpos;
    arr[c].rk = arr[c + c + 1].lpos;
  } else if (arr[c].key == arr[c + c].rkey + arr[c + c + 1].lkey &&
             arr[c].lk > arr[c + c].rpos) {
    arr[c].lk = arr[c + c].rpos;
    arr[c].rk = arr[c + c + 1].lpos;
  } else if (arr[c].key == arr[c + c].rkey + arr[c + c + 1].lkey &&
             arr[c].lk == arr[c + c].rpos && arr[c].rk > arr[c + c + 1].lpos) {
    arr[c].lk = arr[c + c].rpos;
    arr[c].rk = arr[c + c + 1].lpos;
  }
  if (arr[c].key < arr[c + c + 1].key) {
    arr[c].key = arr[c + c + 1].key;
    arr[c].lk = arr[c + c + 1].lk;
    arr[c].rk = arr[c + c + 1].rk;
  }
  arr[c].lkey = arr[c + c].lkey;
  arr[c].lpos = arr[c + c].lpos;
  if (arr[c].lkey < arr[c + c].sum + arr[c + c + 1].lkey) {
    arr[c].lkey = arr[c + c].sum + arr[c + c + 1].lkey;
    arr[c].lpos = arr[c + c + 1].lpos;
  }
  arr[c].rkey = arr[c + c + 1].rkey;
  arr[c].rpos = arr[c + c + 1].rpos;
  if (arr[c].rkey <= arr[c + c + 1].sum + arr[c + c].rkey) {
    arr[c].rkey = arr[c + c + 1].sum + arr[c + c].rkey;
    arr[c].rpos = arr[c + c].rpos;
  }
}
void build(int L, int R, int c) {
  arr[c].l = L;
  arr[c].r = R;
  if (L == R) {
    arr[c].lk = arr[c].rk = arr[c].lpos = arr[c].rpos = L;
    arr[c].sum = arr[c].key = arr[c].lkey = arr[c].rkey = a[L];
    return;
  }
  build(L, (L + R) / 2, c + c);
  build((L + R) / 2 + 1, R, c + c + 1);
  arr[c].sum = arr[c + c].sum + arr[c + c + 1].sum;
  up(c);
}
int ll, rr, RL, RR;
double tsum, res;
void find(int L, int R, int c) {
  if (L <= arr[c].l && R >= arr[c].r) {
    if (rr != -1 && (RL == -1 || res < tsum + arr[c].lkey)) {
      res = tsum + arr[c].lkey;
      RL = ll;
      RR = arr[c].lpos;
    }
    if (RL == -1 || res < arr[c].key) {
      res = arr[c].key;
      RL = arr[c].lk;
      RR = arr[c].rk;
    }
    if (rr == -1 || arr[c].rkey > tsum + arr[c].sum) {
      ll = arr[c].rpos;
      rr = arr[c].r;
      tsum = arr[c].rkey;
    } else {
      rr = arr[c].r;
      tsum += arr[c].sum;
    }
    return;
  }
  if (L <= (arr[c].l + arr[c].r) / 2) find(L, R, c + c);
  if (R > (arr[c].l + arr[c].r) / 2) find(L, R, c + c + 1);
}
int x[N];
double P[N];
int main() {
  int n, m, C, i, ca = 1, A, B;
  while (~scanf("%d%d%d", &n, &m, &C)) {
    for (i = 1; i <= n; i++) scanf("%d", x + i);
    for (i = 1; i < n; i++) {
      scanf("%lf", P + i);
      P[i] /= 100.0;
    }
    for (i = 1; i < n; i++) {
      a[i] = (double)(x[i + 1] - x[i]) - P[i] * C * 2.0;
    }
    double all = 0.0;
    n--;
    build(1, n, 1);
    while (m--) {
      scanf("%d%d", &A, &B);
      B--;
      ll = rr = RL = RR = -1;
      find(A, B, 1);
      if (res < 0.0) res = 0.0;
      all += res * 0.5;
    }
    printf("%10lf\n", all);
  }
  return 0;
}
