#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100;
struct node {
  int a, h, l, r;
} p[100002];
int x[400002], id[400002], b[10005], z[10005];
int find(int x, int len) {
  int l = 0, h = len - 1;
  while (l <= h) {
    int m = (l + h) / 2;
    if (id[m] == x) return m;
    if (id[m] > x)
      h = m - 1;
    else
      l = m + 1;
  }
}
double num[400002 * 4], col[400002 * 4];
void build(int t, int l, int r) {
  num[t] = 1;
  col[t] = -1;
  if (l == r) return;
  int m = (l + r) / 2;
  build((t << 1), l, m);
  build(((t << 1) | 1), m + 1, r);
}
void pushdown(int t) {
  if (col[t] > -1e-8) {
    if (col[(t << 1)] > -1e-8)
      col[(t << 1)] *= col[t];
    else
      col[(t << 1)] = col[t];
    if (col[((t << 1) | 1)] > -1e-8)
      col[((t << 1) | 1)] *= col[t];
    else
      col[((t << 1) | 1)] = col[t];
    num[(t << 1)] *= col[t];
    num[((t << 1) | 1)] *= col[t];
    col[t] = -1;
  }
}
void update(int ll, int rr, int t, int l, int r, double v) {
  if (l != r) pushdown(t);
  if (ll <= l && r <= rr) {
    num[t] *= v;
    col[t] = v;
    return;
  }
  int m = (l + r) / 2;
  if (ll <= m) update(ll, rr, (t << 1), l, m, v);
  if (rr > m) update(ll, rr, ((t << 1) | 1), m + 1, r, v);
}
double query(int pos, int t, int l, int r) {
  if (l != r) pushdown(t);
  if (pos == l && pos == r) return num[t];
  int m = (l + r) / 2;
  if (pos <= m) return query(pos, (t << 1), l, m);
  if (pos > m) return query(pos, ((t << 1) | 1), m + 1, r);
}
int main() {
  int n, m;
  while (scanf("%d%d", &n, &m) != EOF) {
    int i;
    int len = 0;
    for (i = 0; i < n; i++) {
      scanf("%d%d%d%d", &p[i].a, &p[i].h, &p[i].l, &p[i].r);
      x[len++] = p[i].a;
      x[len++] = p[i].a - p[i].h;
      x[len++] = p[i].a + p[i].h;
    }
    for (i = 0; i < m; i++) {
      scanf("%d%d", &b[i], &z[i]);
      x[len++] = b[i];
    }
    sort(x, x + len);
    int pos = 0;
    id[0] = x[0];
    for (i = 1; i < len; i++) {
      if (x[i] == x[i - 1]) continue;
      pos++;
      id[pos] = x[i];
    }
    build(1, 0, pos);
    for (i = 0; i < n; i++) {
      int l = find(p[i].a - p[i].h, pos + 1);
      int x = find(p[i].a, pos + 1);
      int r = find(p[i].a + p[i].h, pos + 1);
      update(l, x - 1, 1, 0, pos, (double)(100 - p[i].l) / 100.0);
      update(x + 1, r, 1, 0, pos, (double)(100 - p[i].r) / 100.0);
    }
    double ans = 0;
    for (i = 0; i < m; i++) {
      int x = find(b[i], pos + 1);
      ans += z[i] * query(x, 1, 0, pos);
    }
    printf("%lf\n", ans);
  }
  return 0;
}
