#include <bits/stdc++.h>
using namespace std;
struct TType {
  double max, lmax, rmax;
};
double profit[150000], s[150000];
TType T[150000 << 2];
inline void PushUP(int l, int r, int rt) {
  int m = (l + r) >> 1;
  T[rt].max = max(T[(rt << 1)].rmax + T[(rt << 1 | 1)].lmax,
                  max(T[(rt << 1)].max, T[(rt << 1 | 1)].max));
  T[rt].lmax = max(T[(rt << 1)].lmax, s[m] - s[l - 1] + T[(rt << 1 | 1)].lmax);
  T[rt].rmax = max(T[(rt << 1 | 1)].rmax, T[(rt << 1)].rmax + s[r] - s[m]);
}
void build(int l, int r, int rt) {
  if (l == r) {
    T[rt].max = T[rt].lmax = T[rt].rmax = profit[l];
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, rt << 1);
  build(m + 1, r, rt << 1 | 1);
  PushUP(l, r, rt);
}
TType query(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) return T[rt];
  int m = (l + r) >> 1;
  if (R <= m) return query(L, R, l, m, rt << 1);
  if (L > m) return query(L, R, m + 1, r, rt << 1 | 1);
  TType ans1, ans2, ans;
  ans1 = query(L, m, l, m, rt << 1);
  ans2 = query(m + 1, R, m + 1, r, rt << 1 | 1);
  ans.max = max(ans1.rmax + ans2.lmax, max(ans1.max, ans2.max));
  ans.lmax = max(ans1.lmax, s[m] - s[L - 1] + ans2.lmax);
  ans.rmax = max(ans2.rmax, s[R] - s[m] + ans1.rmax);
  return ans;
}
int main() {
  int n, m, cc, last, now;
  scanf("%d%d%d", &n, &m, &cc);
  scanf("%d", &last);
  for (int i = 1; i < n; i++) {
    scanf("%d", &now);
    profit[i] = (now - last) * 0.5;
    last = now;
  }
  int p;
  for (int i = 1; i < n; i++) {
    scanf("%d", &p);
    profit[i] -= cc * p / 100.0, s[i] = s[i - 1] + profit[i];
  }
  build(1, n - 1, 1);
  double ans = 0;
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    TType temp = query(a, b - 1, 1, n - 1, 1);
    if (temp.max > 0) ans += temp.max;
  }
  printf("%.9lf\n", ans);
  return 0;
}
