#include <bits/stdc++.h>
using namespace std;
using ld = long double;
template <typename T>
bool MinPlace(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
bool MaxPlace(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename S, typename T>
ostream &operator<<(ostream &out, const pair<S, T> &p) {
  out << "{" << p.first << ", " << p.second << "}";
  return out;
}
template <typename T>
ostream &operator<<(ostream &out, const vector<T> &v) {
  out << "[";
  for (int i = 0; i < (int)v.size(); i++) {
    out << v[i];
    if (i != (int)v.size() - 1) out << ", ";
  }
  out << "]";
  return out;
}
struct op {
  long long int p;
  long long int pos;
  int pr;
  op(long long int p, long long int pos, int pr) : pos(pos), p(p), pr(pr){};
  bool operator<(const op &b) const {
    return pos < b.pos || (pos == b.pos and pr < b.pr);
  }
};
ld binexp(ld base, int exp) {
  ld ans = 1.0;
  while (exp) {
    if (exp & 1) ans *= base;
    base *= base;
    exp /= 2;
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  int n, m;
  cin >> n >> m;
  vector<op> ops;
  for (int i = 0; i < n; i++) {
    long long int a, h, l, r;
    cin >> a >> h >> l >> r;
    ops.push_back({100 - r, a + 1, 0});
    ops.push_back({100 - r, a + h + 1, 1});
    ops.push_back({100 - l, a - h, 0});
    ops.push_back({100 - l, a, 1});
  }
  for (int i = 0; i < m; i++) {
    long long int b, z;
    cin >> b >> z;
    ops.push_back({z, b, 2});
  }
  sort(ops.begin(), ops.end());
  ld ans = 0.0;
  int nbad = 0;
  int cnt[101] = {};
  for (int i = 0; i < ops.size(); i++) {
    if (ops[i].pr < 2)
      cnt[ops[i].p] += ops[i].pr ? -1 : 1;
    else if (cnt[0] == 0) {
      ld temp = 1.0;
      for (int j = 1; j < 100; j++) temp *= binexp(j / 100.0, cnt[j]);
      ans += temp * ops[i].p;
    }
  }
  cout << setprecision(10) << fixed << ans;
}
