#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 20, M = 1 << 10;
const int mod = 1e9 + 7;
const long long P = 7 * 17 << 23 | 1, G = 3;
int n, q, c, p[N], x[N];
struct Node {
  long long mx, mi, ans;
} Tree[N];
void push_up(int rt) {
  Tree[rt].mi = min(Tree[rt << 1].mi, Tree[rt << 1 | 1].mi);
  Tree[rt].mx = max(Tree[rt << 1].mx, Tree[rt << 1 | 1].mx);
  Tree[rt].ans = max(Tree[rt << 1].ans, Tree[rt << 1 | 1].ans);
  Tree[rt].ans = max(Tree[rt].ans, Tree[rt << 1 | 1].mx - Tree[rt << 1].mi);
}
void build(int rt, int l, int r) {
  if (l == r) {
    Tree[rt].mi = Tree[rt].mx = 50ll * x[l] - 1ll * c * p[l - 1];
    Tree[rt].ans = 0;
    return;
  }
  int mid = (l + r) >> 1;
  build(rt << 1, l, mid), build(rt << 1 | 1, mid + 1, r);
  push_up(rt);
}
Node query(int rt, int l, int r, int L, int R) {
  if (L <= l && r <= R) return Tree[rt];
  Node ret;
  int mid = (l + r) >> 1;
  if (L <= mid && R <= mid)
    ret = query(rt << 1, l, mid, L, R);
  else if (L > mid)
    ret = query(rt << 1 | 1, mid + 1, r, L, R);
  else {
    Node tmp = query(rt << 1, l, mid, L, R);
    ret = query(rt << 1 | 1, mid + 1, r, L, R);
    ret.ans = max(ret.ans, tmp.ans);
    ret.ans = max(ret.ans, ret.mx - tmp.mi);
    ret.mx = max(ret.mx, tmp.mx), ret.mi = min(ret.mi, tmp.mi);
  }
  return ret;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  cin >> n >> q >> c;
  for (int i = 1; i <= n; i++) cin >> x[i];
  for (int i = 1; i < n; i++) cin >> p[i], p[i] += p[i - 1];
  build(1, 1, n);
  long long res = 0;
  while (q--) {
    int l, r;
    cin >> l >> r;
    res += max(0ll, query(1, 1, n, l, r).ans);
  }
  cout << fixed << setprecision(9) << res / 100.0 << '\n';
  return 0;
}
