#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int MAXM = 10005;
int a[MAXN], h[MAXN];
int pl[MAXN], pr[MAXN];
int b[MAXM];
double z[MAXM];
struct node {
  int v, flag, id;
  node(int a, int b, int c) : v(a), id(b), flag(c) {}
  bool operator<(const node &a) const { return v < a.v; }
};
vector<node> q;
struct node2 {
  int l, r;
  double x;
} p[MAXN];
struct node3 {
  int b, id;
} p2[MAXM];
bool cmp(node2 a, node2 b) { return a.l < b.l; }
bool cmp2(node3 a, node3 b) { return a.b < b.b; }
double sum[MAXN * 3 << 2];
void pushup(int o) { sum[o] = sum[o << 1] * sum[o << 1 | 1]; }
void build(int l, int r, int o) {
  if (l == r) {
    sum[o] = 1.0;
    return;
  }
  int m = l + r >> 1;
  build(l, m, o << 1);
  build(m + 1, r, o << 1 | 1);
  pushup(o);
}
void update(int l, int r, int o, int p, double v) {
  if (l == r) {
    sum[o] *= v;
    return;
  }
  int m = l + r >> 1;
  if (p <= m)
    update(l, m, o << 1, p, v);
  else
    update(m + 1, r, o << 1 | 1, p, v);
  pushup(o);
}
double A;
void call(int l, int r, int o, int L, int R) {
  if (L <= l && r <= R) {
    A = A * sum[o];
    return;
  }
  int m = l + r >> 1;
  if (L <= m) call(l, m, o << 1, L, R);
  if (m < R) call(m + 1, r, o << 1 | 1, L, R);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d%d", &a[i], &h[i], &pl[i], &pr[i]);
    q.push_back(node(a[i] + 1, i, 0));
    q.push_back(node(a[i] + h[i], i, 1));
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%lf", &b[i], &z[i]);
    q.push_back(node(b[i], i, 2));
  }
  sort(q.begin(), q.end());
  int d = 1;
  int L = q.size();
  for (int i = 0; i < L; i++) {
    if (q[i].flag == 0) {
      p[q[i].id].l = d;
      p[q[i].id].x = (100 - pr[q[i].id]) * 1.0 / 100;
    } else if (q[i].flag == 1) {
      p[q[i].id].r = d;
    } else {
      p2[q[i].id].b = d;
      p2[q[i].id].id = q[i].id;
    }
    if (i < L - 1 && q[i].v == q[i + 1].v) {
    } else {
      ++d;
    }
  }
  --d;
  sort(p + 1, p + n + 1, cmp);
  sort(p2 + 1, p2 + m + 1, cmp2);
  int id = 1;
  build(1, d, 1);
  for (int i = 1; i <= m; i++) {
    while (id <= n && p[id].l <= p2[i].b) {
      update(1, d, 1, p[id].r, p[id].x);
      ++id;
    }
    A = 1.0;
    call(1, d, 1, p2[i].b, d);
    z[p2[i].id] *= A;
  }
  q.clear();
  for (int i = 1; i <= n; i++) {
    q.push_back(node(a[i] - h[i], i, 0));
    q.push_back(node(a[i] - 1, i, 1));
  }
  for (int i = 1; i <= m; i++) {
    q.push_back(node(b[i], i, 2));
  }
  sort(q.begin(), q.end());
  d = 1;
  L = q.size();
  for (int i = 0; i < L; i++) {
    if (q[i].flag == 0) {
      p[q[i].id].l = d;
      p[q[i].id].x = (100 - pl[q[i].id]) * 1.0 / 100;
    } else if (q[i].flag == 1) {
      p[q[i].id].r = d;
    } else {
      p2[q[i].id].b = d;
      p2[q[i].id].id = q[i].id;
    }
    if (i < L - 1 && q[i].v == q[i + 1].v) {
    } else {
      ++d;
    }
  }
  --d;
  sort(p + 1, p + n + 1, cmp);
  sort(p2 + 1, p2 + m + 1, cmp2);
  id = 1;
  build(1, d, 1);
  for (int i = 1; i <= m; i++) {
    while (id <= n && p[id].l <= p2[i].b) {
      update(1, d, 1, p[id].r, p[id].x);
      ++id;
    }
    A = 1.0;
    call(1, d, 1, p2[i].b, d);
    z[p2[i].id] *= A;
  }
  double Ans = 0.0;
  for (int i = 1; i <= m; i++) {
    Ans += z[i];
  }
  printf("%.9lf\n", Ans);
  return 0;
}
