#include <bits/stdc++.h>
using namespace std;
const int Max = 150005;
int N, M, C;
int x[Max], p[Max];
long long sum[Max];
struct Info {
  long long mini, maxi;
  long long sol;
} node[Max * 4];
void update(Info &cur, const Info &lt, const Info &rt) {
  cur.mini = min(lt.mini, rt.mini);
  cur.maxi = max(lt.maxi, rt.maxi);
  cur.sol = max(rt.maxi - lt.mini, max(lt.sol, rt.sol));
}
void build(int pos, int L, int R) {
  Info &cur = node[pos];
  if (L == R) {
    cur.mini = sum[L];
    cur.maxi = sum[L];
    cur.sol = 0;
    return;
  }
  int pl = pos << 1;
  int pr = pl | 1;
  int mid = (L + R) / 2;
  build(pl, L, mid);
  build(pr, mid + 1, R);
  update(cur, node[pl], node[pr]);
}
Info query(int pos, int L, int R, int a, int b) {
  if (a <= L) a = L;
  if (b >= R) b = R;
  if (L == a && R == b) return node[pos];
  int pl = pos << 1;
  int pr = pl | 1;
  int mid = (L + R) / 2;
  if (b <= mid) return query(pl, L, mid, a, b);
  if (a >= mid + 1) return query(pr, mid + 1, R, a, b);
  Info ret;
  update(ret, query(pl, L, mid, a, b), query(pr, mid + 1, R, a, b));
  return ret;
}
int main() {
  scanf("%d %d %d", &N, &M, &C);
  for (int i = 0; i < N; ++i) {
    scanf("%d", x + i);
  }
  for (int i = 0; i < N - 1; ++i) {
    scanf("%d", p + i);
  }
  sum[0] = 0;
  for (int i = 0; i < N - 1; ++i) {
    long long val = 50LL * (x[i + 1] - x[i]) - C * p[i];
    sum[i + 1] = sum[i] + val;
  }
  build(1, 0, N - 1);
  long long ans = 0;
  for (int i = 0; i < M; ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    ans += query(1, 0, N - 1, a - 1, b - 1).sol;
  }
  cout << ans / 100 << "." << ans % 100 << "0000000" << endl;
  return 0;
}
