#include <bits/stdc++.h>
using namespace std;
int N, M, C;
int pos[200000], prob[200000];
struct Node {
  Node *l, *r;
  double sum, best, mxl, mxr;
  Node() {}
  Node(double _sum, double _best, double _mxl, double _mxr) {
    sum = _sum;
    best = _best;
    mxl = _mxl;
    mxr = _mxr;
  }
};
void make(Node *&O, int L, int R) {
  O = new Node();
  if (L + 1 == R) {
    O->sum = double(pos[R] - pos[L]) / 2 - (double)(C)*prob[L] / 100;
    O->best = O->mxl = O->mxr = max(O->sum, 0.0);
  } else {
    make(O->l, L, (L + R) / 2);
    make(O->r, (L + R) / 2, R);
    Node *l = O->l, *r = O->r;
    O->sum = l->sum + r->sum;
    O->mxl = max(l->mxl, l->sum + r->mxl);
    O->mxr = max(r->mxr, r->sum + l->mxr);
    O->best = max(l->best, r->best);
    O->best = max(O->best, l->mxr + r->mxl);
  }
}
Node query(Node *O, int L, int R, int A, int B) {
  if (B <= L || R <= A)
    return Node(0, 0, 0, 0);
  else if (A <= L && R <= B)
    return *O;
  else {
    Node l = query(O->l, L, (L + R) / 2, A, B);
    Node r = query(O->r, (L + R) / 2, R, A, B);
    Node re;
    re.sum = l.sum + r.sum;
    re.mxl = max(l.mxl, l.sum + r.mxl);
    re.mxr = max(r.mxr, r.sum + l.mxr);
    re.best = max(l.best, r.best);
    re.best = max(re.best, l.mxr + r.mxl);
    return re;
  }
}
Node *root;
double Ans;
int main() {
  scanf("%d %d %d", &N, &M, &C);
  for (int Ni = 1; Ni <= N; Ni++) scanf("%d", &pos[Ni]);
  for (int Ni = 1; Ni < N; Ni++) scanf("%d", &prob[Ni]);
  make(root, 1, N);
  for (int Mi = 0; Mi < M; Mi++) {
    int a, b;
    scanf("%d %d", &a, &b);
    Ans += query(root, 1, N, a, b).best;
  }
  printf("%.9lf\n", Ans);
}
