#include <bits/stdc++.h>
using namespace std;
int n, m, k, a[100005], h[100005], pl[100005], pr[100005], c[10005], d[10005];
double ans, t[40005];
struct node {
  int a, z;
} b[10005];
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) x = (x + (x << 2) << 1) + (ch ^ 48);
  return x * f;
}
void build(int i, int l, int r) {
  t[i] = 1;
  if (l == r) return;
  int mid = l + r >> 1;
  build(i << 1, l, mid), build(i << 1 | 1, mid + 1, r);
}
void mdf(int i, int l, int r, int x, int y, double z) {
  if (x <= l && y >= r) {
    t[i] *= z;
    return;
  }
  int mid = l + r >> 1;
  if (x <= mid) mdf(i << 1, l, mid, x, y, z);
  if (y > mid) mdf(i << 1 | 1, mid + 1, r, x, y, z);
}
void query(int i, int l, int r, double x) {
  x *= t[i];
  if (l == r) {
    ans += x * d[l];
    return;
  }
  int mid = l + r >> 1;
  query(i << 1, l, mid, x), query(i << 1 | 1, mid + 1, r, x);
}
int main() {
  n = read(), m = read();
  for (int i = 1; i <= n; i++)
    a[i] = read(), h[i] = read(), pl[i] = read(), pr[i] = read();
  for (int i = 1; i <= m; i++) b[i].a = c[i] = read(), b[i].z = read();
  sort(c + 1, c + m + 1);
  k = unique(c + 1, c + m + 1) - c - 1;
  build(1, 1, k);
  for (int i = 1; i <= m; i++)
    b[i].a = lower_bound(c + 1, c + k + 1, b[i].a) - c, d[b[i].a] += b[i].z;
  for (int i = 1; i <= n; i++) {
    int l = lower_bound(c + 1, c + k + 1, a[i] - h[i]) - c,
        r = lower_bound(c + 1, c + k + 1, a[i]) - c - 1;
    if (l <= r) mdf(1, 1, k, l, r, 1 - 0.01 * pl[i]);
    l = upper_bound(c + 1, c + k + 1, a[i]) - c;
    r = upper_bound(c + 1, c + k + 1, a[i] + h[i]) - c - 1;
    if (l <= r) mdf(1, 1, k, l, r, 1 - 0.01 * pr[i]);
  }
  query(1, 1, k, 1);
  printf("%.10lf", ans);
  return 0;
}
