#include <bits/stdc++.h>
struct node {
  double maxSum, leftSum, rightSum, sum;
};
int point[150000], segment[150000], probability[150000];
node tree[4 * 150000];
int n, m, c;
void buildTree(int l, int r, int i) {
  if (l == r) {
    tree[i].maxSum = (double)segment[l] / 2 - (double)c * probability[l] / 100;
    tree[i].sum = tree[i].leftSum = tree[i].rightSum = tree[i].maxSum;
    return;
  }
  int mid = l + (r - l) / 2;
  buildTree(l, mid, 2 * i + 1);
  buildTree(mid + 1, r, 2 * i + 2);
  tree[i].sum = tree[2 * i + 1].sum + tree[2 * i + 2].sum;
  tree[i].leftSum = ((tree[2 * i + 1].leftSum) >
                             (tree[2 * i + 1].sum + tree[2 * i + 2].leftSum)
                         ? (tree[2 * i + 1].leftSum)
                         : (tree[2 * i + 1].sum + tree[2 * i + 2].leftSum));
  tree[i].rightSum = ((tree[2 * i + 2].rightSum) >
                              (tree[2 * i + 2].sum + tree[2 * i + 1].rightSum)
                          ? (tree[2 * i + 2].rightSum)
                          : (tree[2 * i + 2].sum + tree[2 * i + 1].rightSum));
  tree[i].maxSum = ((tree[2 * i + 1].maxSum) > (tree[2 * i + 2].maxSum)
                        ? (tree[2 * i + 1].maxSum)
                        : (tree[2 * i + 2].maxSum));
  tree[i].maxSum =
      ((tree[i].maxSum) >
               (((tree[i].leftSum) > (tree[i].rightSum) ? (tree[i].leftSum)
                                                        : (tree[i].rightSum)))
           ? (tree[i].maxSum)
           : (((tree[i].leftSum) > (tree[i].rightSum) ? (tree[i].leftSum)
                                                      : (tree[i].rightSum))));
  tree[i].maxSum =
      ((tree[i].maxSum) > (tree[2 * i + 1].rightSum + tree[2 * i + 2].leftSum)
           ? (tree[i].maxSum)
           : (tree[2 * i + 1].rightSum + tree[2 * i + 2].leftSum));
}
node query(int l, int r, int i, int x, int y) {
  if (l >= x && r <= y) {
    return tree[i];
  }
  int mid = l + (r - l) / 2;
  if (mid < x) {
    return query(mid + 1, r, 2 * i + 2, x, y);
  } else if (mid + 1 > y) {
    return query(l, mid, 2 * i + 1, x, y);
  } else {
    node n1 = query(l, mid, 2 * i + 1, x, y);
    node n2 = query(mid + 1, r, 2 * i + 2, x, y);
    node res;
    res.sum = n1.sum + n2.sum;
    res.leftSum =
        ((n1.leftSum) > (n1.sum + n2.leftSum) ? (n1.leftSum)
                                              : (n1.sum + n2.leftSum));
    res.rightSum =
        ((n2.rightSum) > (n2.sum + n1.rightSum) ? (n2.rightSum)
                                                : (n2.sum + n1.rightSum));
    res.maxSum = ((n1.maxSum) > (n2.maxSum) ? (n1.maxSum) : (n2.maxSum));
    res.maxSum =
        ((res.maxSum) > (((res.leftSum) > (res.rightSum) ? (res.leftSum)
                                                         : (res.rightSum)))
             ? (res.maxSum)
             : (((res.leftSum) > (res.rightSum) ? (res.leftSum)
                                                : (res.rightSum))));
    res.maxSum = ((res.maxSum) > (n1.rightSum + n2.leftSum)
                      ? (res.maxSum)
                      : (n1.rightSum + n2.leftSum));
    return res;
  }
}
int main(void) {
  scanf("%d %d %d", &n, &m, &c);
  for (int i = 0; i < n; i++) {
    scanf("%d", &point[i]);
  }
  for (int i = 1; i < n; i++) {
    segment[i - 1] = point[i] - point[i - 1];
  }
  n--;
  for (int i = 0; i < n; i++) {
    scanf("%d", &probability[i]);
  }
  buildTree(0, n - 1, 0);
  double sol = 0;
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    double best = query(0, n - 1, 0, x - 1, y - 2).maxSum;
    if (best > 0) {
      sol += best;
    }
  }
  printf("%f\n", sol);
  return 0;
}
