#include <bits/stdc++.h>
using namespace std;
const int M = 150000 + 10;
struct TREE {
  int l, r;
  double maxsub;
  double maxprefix, maxsuffix;
  double sum;
} tree[4 * M];
int a[M];
int p[M];
double E[M];
void build(int isize, int l, int r, int node) {
  tree[node].l = l;
  tree[node].r = r;
  if (l == r) {
    tree[node].maxprefix = E[l];
    tree[node].maxsuffix = E[l];
    tree[node].maxsub = E[l];
    tree[node].sum = E[l];
    return;
  } else {
    int mid = (l + r) / 2;
    build(isize, l, mid, 2 * node);
    build(isize, mid + 1, r, 2 * node + 1);
    tree[node].sum = tree[2 * node].sum + tree[2 * node + 1].sum;
    tree[node].maxprefix =
        max(tree[2 * node].maxprefix,
            tree[2 * node].sum + tree[2 * node + 1].maxprefix);
    tree[node].maxsuffix =
        max(tree[2 * node + 1].maxsuffix,
            tree[2 * node + 1].sum + tree[2 * node].maxsuffix);
    tree[node].maxsub = max(tree[2 * node].maxsub, tree[2 * node + 1].maxsub);
    tree[node].maxsub =
        max(tree[node].maxsub,
            tree[2 * node].maxsuffix + tree[2 * node + 1].maxprefix);
    return;
  }
}
TREE query(int node, int l, int r) {
  if (tree[node].l == l && tree[node].r == r) {
    return tree[node];
  } else {
    int mid = (tree[node].l + tree[node].r) / 2;
    if (r <= mid) {
      return query(2 * node, l, r);
    } else {
      if (l >= mid + 1) {
        return query(2 * node + 1, l, r);
      } else {
        TREE tree1 = query(2 * node, l, mid);
        TREE tree2 = query(2 * node + 1, mid + 1, r);
        TREE tree3;
        tree3.maxprefix = max(tree1.maxprefix, tree1.sum + tree2.maxprefix);
        tree3.maxsuffix = max(tree2.maxsuffix, tree2.sum + tree1.maxsuffix);
        tree3.maxsub = max(tree1.maxsub, tree2.maxsub);
        tree3.maxsub = max(tree3.maxsub, tree1.maxsuffix + tree2.maxprefix);
        tree3.sum = tree1.sum + tree2.sum;
        return tree3;
      }
    }
  }
}
int main() {
  time_t t_start, t_end;
  t_start = clock();
  int n, m, c;
  cin >> n >> m >> c;
  int isize = 1;
  while (isize * 2 <= n) {
    isize *= 2;
  }
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  for (int i = 1; i <= n - 1; i++) {
    cin >> p[i];
  }
  for (int i = 1; i <= n - 1; i++) {
    E[i] = (a[i + 1] - a[i]) / 2.0 - 1.0 * p[i] / 100 * c;
  }
  build(isize, 1, n - 1, 1);
  double ans = 0;
  for (int i = 0; i < m; i++) {
    int l, r;
    cin >> l >> r;
    TREE tree1 = query(1, l, r - 1);
    if (tree1.maxsub > 0) {
      ans += tree1.maxsub;
    }
  }
  printf("%.10f\n", ans);
  t_end = clock();
  return 0;
}
