#include <bits/stdc++.h>
using namespace std;
struct node {
  double l, c, r, t;
  int a, b;
} tree[4 * 150000];
double expv[150000];
void build(int x, int a, int b) {
  tree[x].a = a;
  tree[x].b = b;
  if (tree[x].a != tree[x].b) {
    build(2 * x, a, (a + b) / 2);
    build(2 * x + 1, (a + b) / 2 + 1, b);
    tree[x].l = max(tree[2 * x].l, tree[2 * x].t + tree[2 * x + 1].l);
    tree[x].t = tree[2 * x].t + tree[2 * x + 1].t;
    tree[x].r = max(tree[2 * x + 1].r, tree[2 * x + 1].t + tree[2 * x].r);
    tree[x].c = max(tree[2 * x].r + tree[2 * x + 1].l,
                    max(tree[2 * x].c, tree[2 * x + 1].c));
  } else
    tree[x].c = max(0.0, tree[x].l = tree[x].t = tree[x].r = expv[tree[x].a]);
}
node query(int x, int a, int b) {
  node ans;
  ans.l = -1;
  if (a > tree[x].b || b < tree[x].a) return ans;
  if (a <= tree[x].a && tree[x].b <= b) return tree[x];
  node a1 = query(2 * x, a, b), a2 = query(2 * x + 1, a, b);
  ans.l = max(a1.l, a1.t + a2.l);
  ans.t = a1.t + a2.t;
  ans.r = max(a2.r, a2.t + a1.r);
  ans.c = max(a1.r + a2.l, max(a1.c, a2.c));
  return ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, m, c;
  cin >> n >> m >> c;
  double x[n];
  for (int i = 0; i < n; i++) cin >> x[i];
  for (int i = 0; i < n - 1; i++) {
    double p;
    cin >> p;
    expv[i] = (x[i + 1] - x[i]) * 0.5 - c * p * 0.01;
  }
  build(1, 0, n - 2);
  double ans = 0;
  while (m--) {
    int a, b;
    cin >> a >> b;
    a--;
    b -= 2;
    node n = query(1, a, b);
    ans += n.c;
  }
  cout << fixed << setprecision(7) << ans << endl;
  return 0;
}
