#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
struct Node {
  long long m, l, r;
} Tree[1000000], Ans;
int p[200000], pos[200000];
long long sum[200000];
int n, m, c;
int LCN(int node) { return node << 1; }
int RCN(int node) { return (node << 1) + 1; }
void buildTree(int l, int r, int node) {
  if (l == r) {
    Tree[node].m = max(0LL, sum[r] - sum[l - 1]);
    Tree[node].l = Tree[node].r = Tree[node].m;
    return;
  }
  int mid = (l + r) >> 1;
  buildTree(l, mid, LCN(node));
  buildTree(mid + 1, r, RCN(node));
  Tree[node].m =
      max(Tree[LCN(node)].m,
          max(Tree[RCN(node)].m, Tree[LCN(node)].r + Tree[RCN(node)].l));
  Tree[node].l =
      max(Tree[LCN(node)].l, sum[mid] - sum[l - 1] + Tree[RCN(node)].l);
  Tree[node].r = max(Tree[RCN(node)].r, sum[r] - sum[mid] + Tree[LCN(node)].r);
  return;
}
void query(int x, int y, int l, int r, int node) {
  if (x > r || y < l) {
    return;
  }
  if (x <= l && r <= y) {
    Ans.m = max(Ans.m, max(Tree[node].m, Tree[node].l + Ans.r));
    Ans.l = max(Ans.l, sum[l - 1] - sum[x - 1] + Tree[node].l);
    Ans.r = max(Tree[node].r, sum[r] - sum[l - 1] + Ans.r);
  } else {
    query(x, y, l, (l + r) >> 1, LCN(node));
    query(x, y, ((l + r) >> 1) + 1, r, RCN(node));
  }
}
int main(int argc, char *argv[]) {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 0; i < n; i++) {
    scanf("%d", &pos[i]);
  }
  for (int i = 1; i < n; i++) {
    scanf("%d", &p[i]);
    long long x = (pos[i] - pos[i - 1]) * 50LL - p[i] * c * 1LL;
    sum[i] = x;
    sum[i] += sum[i - 1];
  }
  long long ans = 0;
  buildTree(1, n - 1, 1);
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    Ans.m = Ans.l = Ans.r = 0;
    query(x, y - 1, 1, n - 1, 1);
    ans += Ans.m;
  }
  printf("%.8lf\n", ans * 0.01);
  return 0;
}
