#include <bits/stdc++.h>
using namespace std;
int const N = 1e4 + 10;
int const N10 = N * 10;
int a[N10], h[N10], l[N10], r[N10];
int b[N], z[N];
vector<int> x;
struct SegmentTree {
  struct node {
    double p, dirty;
    node(double p = 1, double dirty = -1) : p(p), dirty(dirty) {}
    void modify(double _p) {
      if (dirty < 0) dirty = 1;
      p *= _p, dirty *= _p;
    }
  } f[N << 2];
  void down(int r, int ls, int rs) {
    if (f[r].dirty < 0) return;
    f[ls].modify(f[r].dirty);
    f[rs].modify(f[r].dirty);
    f[r].dirty = -1;
  }
  void modify(int r, int L, int R, int a, int b, double p) {
    if (R < a || L > b || a > b) return;
    if (a <= L && R <= b) {
      f[r].modify(p);
    } else {
      int M = L + (R - L) / 2, ls = r << 1, rs = ls | 1;
      down(r, ls, rs);
      modify(ls, L, M, a, b, p);
      modify(rs, M + 1, R, a, b, p);
    }
  }
  double prob(int r, int L, int R, int k) {
    if (k <= L && R <= k) return f[r].p;
    int M = L + (R - L) / 2, ls = r << 1, rs = ls | 1;
    down(r, ls, rs);
    if (M >= k) return prob(ls, L, M, k);
    return prob(rs, M + 1, R, k);
  }
} T;
int id(int a) { return lower_bound(x.begin(), x.end(), a) - x.begin(); }
pair<int, int> seg(int a, int b) {
  int l = lower_bound(x.begin(), x.end(), a) - x.begin();
  int r = upper_bound(x.begin(), x.end(), b) - x.begin() - 1;
  return {l, r};
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) scanf("%d%d%d%d", a + i, h + i, l + i, r + i);
  for (int i = 0; i < m; ++i) scanf("%d%d", b + i, z + i);
  x.assign(b, b + m);
  sort(x.begin(), x.end());
  x.erase(unique(x.begin(), x.end()), x.end());
  int sz = (int)x.size();
  for (int i = 0; i < n; ++i) {
    auto p = seg(a[i] - h[i], a[i] - 1);
    T.modify(1, 0, sz - 1, p.first, p.second, 1 - l[i] / 100.);
    p = seg(a[i] + 1, a[i] + h[i]);
    T.modify(1, 0, sz - 1, p.first, p.second, 1 - r[i] / 100.);
  }
  double e = 0;
  for (int i = 0; i < m; ++i) e += z[i] * T.prob(1, 0, sz - 1, id(b[i]));
  printf("%.20f\n", e);
  return 0;
}
