#include <bits/stdc++.h>
using namespace std;
const int maxn = 110000;
const int inf = 1 << 30;
int n, m, cur = 0, a[maxn], h[maxn], l[maxn], r[maxn];
double ans = 0;
struct segment {
  int l, r, lchild, rchild;
  double prod;
} t[maxn * 4];
struct mush {
  int pos, value;
  mush() {}
  mush(int pos) : pos(pos), value(0) {}
} x[maxn];
inline bool operator<(mush A, mush B) { return A.pos < B.pos; }
int build(int L, int R) {
  int p = ++cur;
  t[p].l = L;
  t[p].r = R;
  t[p].prod = 1;
  if (t[p].l == t[p].r) {
    t[p].prod = 1;
  } else {
    int mid = (t[p].l + t[p].r) >> 1;
    t[p].lchild = build(L, mid);
    t[p].rchild = build(mid + 1, R);
  }
  return p;
}
void update(int p, int L, int R, double v) {
  if (L <= t[p].l && R >= t[p].r) {
    t[p].prod *= v;
  } else {
    int mid = (t[p].l + t[p].r) >> 1;
    if (L <= mid) update(t[p].lchild, L, R, v);
    if (R > mid) update(t[p].rchild, L, R, v);
  }
}
void dfs(int p) {
  if (t[p].l == t[p].r)
    ans += t[p].prod * x[t[p].l].value;
  else {
    t[t[p].lchild].prod *= t[p].prod;
    t[t[p].rchild].prod *= t[p].prod;
    dfs(t[p].lchild);
    dfs(t[p].rchild);
  }
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%d %d %d %d", &a[i], &h[i], &l[i], &r[i]);
  for (int i = 1; i <= m; ++i) scanf("%d %d", &x[i].pos, &x[i].value);
  sort(x + 1, x + m + 1);
  x[0].pos = -inf;
  x[m + 1].pos = inf;
  int root = build(1, m);
  for (int i = 1; i <= n; ++i) {
    int L = lower_bound(x, x + m + 1, mush(a[i] - h[i])) - x;
    int R = lower_bound(x, x + m + 1, mush(a[i])) - x - 1;
    if (L > 0 && L <= R) update(root, L, R, 1.0 - l[i] / 100.0);
  }
  for (int i = 1; i <= n; ++i) {
    int L = upper_bound(x, x + m + 1, mush(a[i])) - x;
    int R = upper_bound(x, x + m + 1, mush(a[i] + h[i])) - x - 1;
    if (R <= m && L <= R) update(root, L, R, 1.0 - r[i] / 100.0);
  }
  dfs(root);
  printf("%.10f\n", ans);
  return 0;
}
