#include <bits/stdc++.h>
using namespace std;
void show() { cout << '\n'; }
template <typename T, typename... Args>
void show(T a, Args... args) {
  cout << a << " ";
  show(args...);
}
template <typename T>
void show_c(T& a) {
  for (auto& x : a) {
    cout << x << " ";
  }
  cout << endl;
}
struct node {
  double val, sum;
  int left, right;
  double suffix, prefix;
} tree[5 * 150100];
double arr[150100];
int mark[150100];
node merge(node x, node y) {
  node tmp;
  tmp.val = max(x.suffix + y.prefix, max(x.val, y.val));
  tmp.sum = x.sum + y.sum;
  tmp.prefix = max(x.prefix, x.sum + y.prefix);
  tmp.suffix = max(y.suffix, y.sum + x.suffix);
  tmp.left = x.left;
  tmp.right = y.right;
  return tmp;
}
void build(int num, int le, int ri) {
  tree[num].left = le;
  tree[num].right = ri;
  if (le == ri) {
    mark[le] = num;
    tree[num].val = tree[num].sum = arr[le];
    tree[num].prefix = tree[num].suffix = arr[le];
  } else {
    build(2 * num, le, (le + ri) / 2);
    build(2 * num + 1, (le + ri) / 2 + 1, ri);
    tree[num] = merge(tree[2 * num], tree[2 * num + 1]);
  }
}
node query(int num, int ql, int qr) {
  if (ql <= tree[num].left && qr >= tree[num].right)
    return tree[num];
  else {
    bool lon = false, ron = false;
    if (ql <= tree[2 * num].right) lon = true;
    if (qr >= tree[2 * num + 1].left) ron = true;
    if (lon && ron) {
      return merge(query(2 * num, ql, qr), query(2 * num + 1, ql, qr));
    } else if (lon) {
      return query(2 * num, ql, qr);
    } else if (ron) {
      return query(2 * num + 1, ql, qr);
    }
  }
}
void update(int pos, int val) {
  int pp = mark[pos];
  tree[pp].val = tree[pp].sum = val;
  tree[pp].prefix = tree[pp].suffix = val;
  pp /= 2;
  while (pp) {
    tree[pp] = merge(tree[2 * pp], tree[2 * pp + 1]);
    pp /= 2;
  }
}
int n, m, c;
int pos[150100];
double pro[150100];
int main() {
  scanf("%d %d %d", &n, &m, &c);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &pos[i]);
  }
  for (int i = 1; i < n; ++i) {
    scanf("%lf", &pro[i]);
    pro[i] /= 100.0;
  }
  pro[n] = 0;
  for (int i = 1; i < n; ++i) {
    arr[i] = double(pos[i + 1] - pos[i]) / 2.0 - pro[i] * c;
  }
  build(1, 1, n);
  double ans = 0;
  int a, b;
  for (int i = 0; i < m; ++i) {
    scanf("%d %d", &a, &b);
    b--;
    ans += max(0.0, query(1, a, b).val);
  }
  printf("%.8f\n", ans);
  return 0;
}
