#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int n, m, cnt, pos[4 * N];
double ans, sum;
struct mushroom {
  int a, b;
  double v;
} mo[N];
struct tree {
  int a, h, l, r, m;
  double p1, p2;
} ya[N];
struct segment {
  int l, r;
  double tag, p;
} tr[4 * N];
void build(int k, int l, int r) {
  tr[k].l = l;
  tr[k].r = r;
  tr[k].tag = 1;
  tr[k].p = 1;
  if (l == r) {
    return;
  }
  int mid = (l + r) >> 1;
  build(k << 1, l, mid);
  build(k << 1 | 1, mid + 1, r);
}
void down(int k) {
  tr[k << 1].tag *= tr[k].tag;
  tr[k << 1 | 1].tag *= tr[k].tag;
  tr[k << 1].p *= tr[k].tag;
  tr[k << 1 | 1].p *= tr[k].tag;
  tr[k].tag = 1.0;
}
void update(int k, int l, int r, double p) {
  if (l <= tr[k].l && tr[k].r <= r) {
    tr[k].tag *= p;
    tr[k].p *= p;
    return;
  }
  down(k);
  int mid = (tr[k].l + tr[k].r) >> 1;
  if (l <= mid) update(k << 1, l, r, p);
  if (mid < r) update(k << 1 | 1, l, r, p);
}
double query(int k, int q) {
  if (tr[k].l == tr[k].r && tr[k].l == q) {
    return tr[k].p;
  }
  down(k);
  int mid = (tr[k].l + tr[k].r) >> 1;
  if (q <= mid) return query(k << 1, q);
  return query(k << 1 | 1, q);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%lf%lf", &ya[i].a, &ya[i].h, &ya[i].p1, &ya[i].p2);
    pos[cnt++] = ya[i].a;
    pos[cnt++] = ya[i].a - ya[i].h;
    pos[cnt++] = ya[i].a + ya[i].h;
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%lf", &mo[i].a, &mo[i].v);
    pos[cnt++] = mo[i].a;
    sum += mo[i].v;
  }
  sort(pos, pos + cnt);
  int tot = cnt;
  cnt = 1;
  for (int i = 1; i < tot; i++) {
    if (pos[i] != pos[cnt - 1]) pos[cnt++] = pos[i];
  }
  for (int i = 1; i <= n; i++) {
    ya[i].m = lower_bound(pos, pos + cnt, ya[i].a) - pos;
    ya[i].l = lower_bound(pos, pos + cnt, ya[i].a - ya[i].h) - pos;
    ya[i].r = lower_bound(pos, pos + cnt, ya[i].a + ya[i].h) - pos;
  }
  for (int i = 1; i <= m; i++) {
    mo[i].b = lower_bound(pos, pos + cnt, mo[i].a) - pos;
  }
  build(1, 0, cnt - 1);
  for (int i = 1; i <= n; i++) {
    if (ya[i].l <= ya[i].m - 1) {
      update(1, ya[i].l, ya[i].m - 1, 1.0 - (ya[i].p1) / 100.0);
    }
    if (ya[i].m + 1 <= ya[i].r) {
      update(1, ya[i].m + 1, ya[i].r, 1.0 - (ya[i].p2) / 100.0);
    }
  }
  for (int i = 1; i <= m; i++) {
    ans += (1.0 - query(1, mo[i].b)) * mo[i].v;
  }
  printf("%lf", sum - ans);
  return 0;
}
