#include <bits/stdc++.h>
using namespace std;
const long long nmax = 150010;
long long n, m;
long long len[nmax], p[nmax], c;
double val[nmax];
struct seg {
  seg *left, *right;
  int start, finish, mid;
  double mysum, mysub, mypre, mysuff;
  seg() { mysum = mysub = mypre = mysuff = 0.0; }
  double sum(int a, int b) {
    if (b < a || a < start || b > finish) return 0.0;
    if (a == start && b == finish) return mysum;
    double ans = 0.0;
    if (a <= mid) ans += left->sum(a, min(b, mid));
    if (b > mid) ans += right->sum(max(mid + 1, a), b);
    return ans;
  }
  double sub(int a, int b) {
    if (b < a || a < start || b > finish) return 0.0;
    if (a == start && b == finish) return mysub;
    double ans = 0.0;
    if (a <= mid) ans = max(ans, left->sub(a, min(b, mid)));
    if (b > mid) ans = max(ans, right->sub(max(mid + 1, a), b));
    if (a <= mid && b > mid)
      ans = max(ans, left->suff(a, mid) + right->pre(mid + 1, b));
    return ans;
  }
  double pre(int a, int b) {
    if (b < a || a < start || b > finish) return 0.0;
    if (a == start && b == finish) return mypre;
    double ans = 0.0;
    if (a <= mid) ans = max(ans, left->pre(a, min(b, mid)));
    if (b > mid && a > mid) ans = max(ans, right->pre(max(a, mid + 1), b));
    if (a <= mid && b > mid)
      ans = max(ans, left->sum(a, mid) + right->pre(mid + 1, b));
    return ans;
  }
  double suff(int a, int b) {
    if (b < a || a < start || b > finish) return 0.0;
    if (a == start && b == finish) return mysuff;
    double ans = 0.0;
    if (a <= mid && b <= mid) ans = max(ans, left->suff(a, min(b, mid)));
    if (b > mid) ans = max(ans, right->suff(max(a, mid + 1), b));
    if (a <= mid && b > mid)
      ans = max(ans, left->suff(a, mid) + right->sum(mid + 1, b));
    return ans;
  }
  void build() {
    start = left->start;
    mid = left->finish;
    finish = right->finish;
    mysum = left->mysum + right->mysum;
    mysub = max(left->mysub, right->mysub);
    mysub = max(mysub, left->mysuff + right->mypre);
    mypre = max(left->mypre, left->mysum + right->mypre);
    mysuff = max(right->mysuff, left->mysuff + right->mysum);
  }
};
seg segt[1 << 19];
int main() {
  cin >> n >> m >> c;
  n--;
  long long last;
  cin >> last;
  for (long long i = 0; i < n; ++i) {
    long long t;
    cin >> t;
    len[i] = t - last;
    last = t;
  }
  for (long long i = 0; i < n; ++i) cin >> p[i];
  for (long long i = 0; i < n; ++i) {
    val[i] = ((double)len[i] / 2.0 - (double)p[i] * 0.01 * (double)c);
  }
  for (int i = (1 << 18); i < (1 << 19); ++i) {
    int ind = i - (1 << 18);
    segt[i].start = segt[i].finish = ind;
    if (ind < n)
      segt[i].mysum = segt[i].mysub = segt[i].mypre = segt[i].mysuff = val[ind];
    segt[i].mysub = max(segt[i].mysub, 0.0);
    segt[i].mypre = max(segt[i].mypre, 0.0);
    segt[i].mysuff = max(segt[i].mysuff, 0.0);
  }
  for (int i = (1 << 18) - 1; i >= 1; --i) {
    segt[i].left = &segt[2 * i];
    segt[i].right = &segt[2 * i + 1];
    segt[i].build();
  }
  double ans = 0.0;
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    ans += segt[1].sub(a - 1, b - 2);
  }
  cout << fixed << setprecision(10) << ans << '\n';
}
