#include <bits/stdc++.h>
using namespace std;
double max(double x, double y) { return x > y ? x : y; }
void swap(int &x, int &y) {
  int t;
  t = x, x = y, y = t;
}
int max(int x, int y) { return x > y ? x : y; }
struct po {
  double maxl, maxm, maxr, all;
};
double MAX_l[300001 << 2];
double MAX_m[300001 << 2];
double MAX_r[300001 << 2];
double ALL[300001 << 2];
void PushUP(int rt) {
  MAX_l[rt] = max(MAX_l[rt << 1], ALL[rt << 1] + MAX_l[rt << 1 | 1]);
  MAX_r[rt] = max(MAX_r[rt << 1] + ALL[rt << 1 | 1], MAX_r[rt << 1 | 1]);
  MAX_m[rt] = max(max(MAX_m[rt << 1], MAX_m[rt << 1 | 1]),
                  MAX_r[rt << 1] + MAX_l[rt << 1 | 1]);
  MAX_m[rt] = max(max(MAX_m[rt], MAX_l[rt]), MAX_r[rt]);
  ALL[rt] = ALL[rt << 1] + ALL[rt << 1 | 1];
}
double dp[300001];
void build(int l, int r, int rt) {
  if (l == r) {
    MAX_l[rt] = MAX_m[rt] = MAX_r[rt] = ALL[rt] = dp[l];
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, rt << 1);
  build(m + 1, r, rt << 1 | 1);
  PushUP(rt);
}
po query(int L, int R, int l, int r, int rt) {
  po ret, ret1, ret2;
  if (L <= l && r <= R) {
    ret.maxl = MAX_l[rt];
    ret.maxm = MAX_m[rt];
    ret.maxr = MAX_r[rt];
    ret.all = ALL[rt];
    return ret;
  }
  int m = (l + r) >> 1;
  if (L <= m) {
    ret1 = query(L, R, l, m, rt << 1);
  } else
    ret1.maxl = ret1.maxm = ret1.maxr = ret1.all = 0;
  if (R > m) {
    ret2 = query(L, R, m + 1, r, rt << 1 | 1);
  } else
    ret2.maxl = ret2.maxm = ret2.maxr = ret2.all = 0;
  ret.maxl = max(ret1.maxl, ret2.maxl + ret1.all);
  ret.maxr = max(ret1.maxr + ret2.all, ret2.maxr);
  ret.maxm = max(max(ret1.maxm, ret2.maxm), ret1.maxr + ret2.maxl);
  ret.maxm = max(max(ret.maxm, ret.maxl), ret.maxr);
  ret.all = ret1.all + ret2.all;
  return ret;
}
int stop[300001];
int cost[300001];
int persent[300001];
int main() {
  int i, j, k;
  int n, m, c;
  while (~scanf("%d%d%d", &n, &m, &c)) {
    for (i = 0; i < n; i++) {
      scanf("%d", &stop[i]);
      if (i) cost[i] = stop[i] - stop[i - 1];
    }
    for (i = 1; i < n; i++) scanf("%d", &persent[i]);
    for (i = 1; i < n; i++) {
      dp[i] = (cost[i] * 1.0 / 2.0) - (c * 1.0 * persent[i] / 100.0);
    }
    build(1, n - 1, 1);
    double ans = 0, tt;
    po ff;
    while (m--) {
      int x, y;
      scanf("%d%d", &x, &y);
      y--;
      ff = query(x, y, 1, n - 1, 1);
      tt = max(max(ff.maxl, ff.maxr), ff.maxm);
      if (tt > 0) ans += tt;
    }
    printf("%.10lf\n", ans);
  }
  return 0;
}
