#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int maxm = 1e4 + 5;
const int N = maxn * 5 + maxm;
struct tree {
  int a, h, l, r;
} ts[maxn];
struct mush {
  int b, z;
} ms[maxm];
vector<int> v;
double tr[N << 2];
double mul[N << 2];
double f[N];
void init(int l, int r, int rt) {
  if (l == r) {
    tr[rt] = 1;
    mul[rt] = 1;
    return;
  }
  init(l, (l + r) / 2, (rt << 1));
  init((l + r) / 2 + 1, r, (rt << 1 | 1));
  tr[rt] = 1;
  mul[rt] = 1;
}
void pushdown(int l, int r, int rt) {
  if (mul[rt] != 1) {
    mul[(rt << 1)] *= mul[rt];
    mul[(rt << 1 | 1)] *= mul[rt];
    mul[rt] = 1;
  }
}
void update(int ql, int qr, int l, int r, int rt, double p) {
  if (ql <= l && r <= qr) {
    mul[rt] *= p;
    return;
  }
  pushdown(l, r, rt);
  if (ql <= (l + r) / 2) update(ql, qr, l, (l + r) / 2, (rt << 1), p);
  if ((l + r) / 2 < qr) update(ql, qr, (l + r) / 2 + 1, r, (rt << 1 | 1), p);
}
double query(int p, int l, int r, int rt) {
  if (l == r) {
    return mul[rt];
  }
  pushdown(l, r, rt);
  if (p <= (l + r) / 2)
    return query(p, l, (l + r) / 2, (rt << 1));
  else
    return query(p, (l + r) / 2 + 1, r, (rt << 1 | 1));
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d%d", &ts[i].a, &ts[i].h, &ts[i].l, &ts[i].r);
    v.push_back(ts[i].a);
    v.push_back(ts[i].a - ts[i].h);
    v.push_back(ts[i].a + ts[i].h);
    v.push_back(ts[i].a - 1);
    v.push_back(ts[i].a + 1);
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &ms[i].b, &ms[i].z);
    v.push_back(ms[i].b);
  }
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  sort(ms + 1, ms + m + 1,
       [](const mush &a, const mush &b) { return a.b < b.b; });
  init(1, N, 1);
  int tmp, p1, p2;
  for (int i = 1; i <= n; i++) {
    tmp = ts[i].a - ts[i].h;
    p1 = lower_bound(v.begin(), v.end(), tmp) - v.begin();
    tmp = ts[i].a - 1;
    p2 = lower_bound(v.begin(), v.end(), tmp) - v.begin();
    update(p1 + 1, p2 + 1, 1, N, 1, (100 - ts[i].l) * 0.01);
    tmp = ts[i].a + 1;
    p1 = lower_bound(v.begin(), v.end(), tmp) - v.begin();
    tmp = ts[i].a + ts[i].h;
    p2 = lower_bound(v.begin(), v.end(), tmp) - v.begin();
    update(p1 + 1, p2 + 1, 1, N, 1, (100 - ts[i].r) * 0.01);
  }
  double ans = 0;
  for (int i = 1; i <= m; i++) {
    p1 = lower_bound(v.begin(), v.end(), ms[i].b) - v.begin();
    ans += ms[i].z * query(p1 + 1, 1, N, 1);
  }
  printf("%.6lf\n", ans);
  return 0;
}
