#include <bits/stdc++.h>
using namespace std;
const int shft = (1 << 17) + 5;
const int maxt = (shft << 1) + 5;
struct tree {
  long double* D;
  long double* P;
  tree() {
    D = new long double[maxt];
    P = new long double[maxt];
    for (int i = 0; i < maxt; ++i) {
      D[i] = 1;
      P[i] = 1;
    }
  }
  void push(int v) {
    if (v < shft) {
      P[v * 2] *= P[v];
      P[v * 2 + 1] *= P[v];
      D[v * 2] *= P[v];
      D[v * 2 + 1] *= P[v];
      P[v] = 1;
    }
  }
  void mult(int v, int lx, int rx, int l, int r, long double k) {
    push(v);
    if (r < lx || l > rx) return;
    if (lx == l && rx == r) {
      P[v] *= k;
      D[v] *= k;
      return;
    }
    int c = (lx + rx) / 2;
    mult(v * 2, lx, c, l, min(c, r), k);
    mult(v * 2 + 1, c + 1, rx, max(l, c + 1), r, k);
    D[v] = D[v * 2] * D[v * 2 + 1];
  }
  void mult(int l, int r, long double k) { mult(1, 0, shft - 1, l, r, k); }
  long double gval(int v, int lx, int rx, int pos) {
    push(v);
    if (lx == pos && rx == pos) {
      return D[v];
    }
    int c = (lx + rx) / 2;
    if (pos <= c)
      return gval(v * 2, lx, c, pos);
    else
      return gval(v * 2 + 1, c + 1, rx, pos);
  }
  long double get_val(int pos) { return gval(1, 0, shft - 1, pos); }
};
struct item {
  int a, h;
  long double l, r;
  item(int a, int h, long double l, long double r) : a(a), h(h), l(l), r(r) {}
};
struct item2 {
  int a, z;
  item2(int a, int z) : a(a), z(z) {}
};
bool operator<(item2 a, item2 b) { return a.a < b.a; }
const int inf = 1 << 30;
const long long linf = 1LL << 60;
tree T;
vector<item> A;
vector<item2> B;
int main() {
  ios::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  A.reserve(n);
  for (int i = 0; i < n; ++i) {
    int a, h;
    long double l, r;
    cin >> a >> h >> l >> r;
    A.push_back(item(a, h, l / 100, r / 100));
  }
  B.reserve(m);
  for (int i = 0; i < m; ++i) {
    int b, z;
    cin >> b >> z;
    B.push_back(item2(b, z));
  }
  sort((B).begin(), (B).end());
  for (int i = 0; i < n; ++i) {
    int l = upper_bound((B).begin(), (B).end(), item2(A[i].a, -1)) - B.begin();
    int r = upper_bound((B).begin(), (B).end(), item2(A[i].a + A[i].h, -1)) -
            B.begin() - 1;
    if (r >= m) --r;
    if (l < 0) ++l;
    if (r >= l) T.mult(l, r, (long double)1 - A[i].r);
    l = lower_bound((B).begin(), (B).end(), item2(A[i].a - A[i].h, -1)) -
        B.begin();
    r = lower_bound((B).begin(), (B).end(), item2(A[i].a, -1)) - B.begin() - 1;
    if (r >= m) --r;
    if (l < 0) ++l;
    if (r < l) continue;
    T.mult(l, r, (long double)1 - A[i].l);
  }
  long double res = 0;
  for (int i = 0; i < m; ++i) {
    res += T.get_val(i) * (long double)B[i].z;
  }
  cout.setf(ios::fixed);
  cout.precision(7);
  cout << res << "\n";
  return 0;
}
