#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &s) {
  s = 0;
  char ch = getchar();
  bool flag = 0;
  while (!isdigit(ch)) flag = ch == '-' ? 1 : flag, ch = getchar();
  while (isdigit(ch)) s = ((s + (s << 2)) << 1) + ch - '0', ch = getchar();
  s = flag ? -s : s;
}
int n, m, Tmp[510000], tl;
double val[510000 << 2], ans;
struct Tree {
  int ll, lr, rl, rr, pl, pr;
} tr[110000];
struct Mushroom {
  int b, z;
} mr[11000];
inline void Pushdown(int now) {
  val[now << 1] *= val[now], val[now << 1 | 1] *= val[now], val[now] = 1.0;
}
inline void Build(int now, int l, int r) {
  val[now] = 1.0;
  if (l == r) return;
  int mid = l + r >> 1;
  Build(now << 1, l, mid), Build(now << 1 | 1, mid + 1, r);
}
inline void Modify(int now, int l, int r, int ql, int qr, double w) {
  if (ql <= l && r <= qr) return (void)(val[now] *= w);
  if (val[now] != 1.0) Pushdown(now);
  int mid = l + r >> 1;
  if (mid < qr) Modify(now << 1 | 1, mid + 1, r, ql, qr, w);
  if (mid >= ql) Modify(now << 1, l, mid, ql, qr, w);
}
inline double Query(int now, int l, int r, int x) {
  if (l == r) return val[now];
  if (val[now] != 1.0) Pushdown(now);
  int mid = l + r >> 1;
  if (mid < x)
    return Query(now << 1 | 1, mid + 1, r, x);
  else
    return Query(now << 1, l, mid, x);
}
int main() {
  read(n), read(m);
  for (int i = 1, a, h; i <= n; ++i) {
    read(a), read(h), read(tr[i].pl), read(tr[i].pr),
        tr[i].ll = a - h, tr[i].lr = a - 1, tr[i].rl = a + 1, tr[i].rr = a + h;
    Tmp[++tl] = tr[i].ll, Tmp[++tl] = tr[i].lr, Tmp[++tl] = tr[i].rl,
    Tmp[++tl] = tr[i].rr;
  }
  for (int i = 1; i <= m; ++i)
    read(mr[i].b), read(mr[i].z), Tmp[++tl] = mr[i].b;
  sort(Tmp + 1, Tmp + 1 + tl), tl = unique(Tmp + 1, Tmp + 1 + tl) - Tmp - 1;
  for (int i = 1; i <= n; ++i)
    tr[i].ll = lower_bound(Tmp + 1, Tmp + 1 + tl, tr[i].ll) - Tmp,
    tr[i].lr = lower_bound(Tmp + 1, Tmp + 1 + tl, tr[i].lr) - Tmp,
    tr[i].rl = lower_bound(Tmp + 1, Tmp + 1 + tl, tr[i].rl) - Tmp,
    tr[i].rr = lower_bound(Tmp + 1, Tmp + 1 + tl, tr[i].rr) - Tmp;
  for (int i = 1; i <= m; ++i)
    mr[i].b = lower_bound(Tmp + 1, Tmp + 1 + tl, mr[i].b) - Tmp;
  Build(1, 1, tl);
  for (int i = 1; i <= n; ++i)
    Modify(1, 1, tl, tr[i].ll, tr[i].lr, 1.0 - (double)tr[i].pl / 100.0),
        Modify(1, 1, tl, tr[i].rl, tr[i].rr, 1.0 - (double)tr[i].pr / 100.0);
  for (int i = 1; i <= m; ++i)
    ans += Query(1, 1, tl, mr[i].b) * (double)mr[i].z;
  printf("%.6lf\n", ans);
  return 0;
}
