#include <bits/stdc++.h>
using namespace std;
const int maxn = 10005;
const int inf = 1 << 29;
const int mod = 1000000007;
const double eps = 1e-10;
struct tree {
  int p, h, l, r;
} tr[maxn * 10];
struct node {
  int p, v;
  bool operator<(const node& a) const { return p < a.p; }
} ji[maxn];
bool lazy[maxn << 2];
double sum[maxn << 2], mul[maxn << 2];
void build(int l, int r, int rt) {
  mul[rt] = 1;
  if (l == r) {
    sum[rt] = ji[l].v;
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, rt << 1);
  build(m + 1, r, rt << 1 | 1);
  sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void modify(int ll, int rr, double v, int l, int r, int rt) {
  if (ll <= l && r <= rr) {
    lazy[rt] = 1;
    mul[rt] *= v;
    sum[rt] *= v;
    return;
  }
  if (lazy[rt]) {
    double p = mul[rt];
    lazy[rt << 1] = lazy[rt << 1 | 1] = 1;
    sum[rt << 1] *= p;
    sum[rt << 1 | 1] *= p;
    mul[rt << 1] *= p;
    mul[rt << 1 | 1] *= p;
    lazy[rt] = 0;
    mul[rt] = 1;
  }
  int m = (l + r) >> 1;
  if (ll <= m) modify(ll, rr, v, l, m, rt << 1);
  if (rr > m) modify(ll, rr, v, m + 1, r, rt << 1 | 1);
  sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
int n, m;
vector<int> v;
int low(int x) { return lower_bound(v.begin(), v.end(), x) - v.begin(); }
int up(int x) { return upper_bound(v.begin(), v.end(), x) - v.begin(); }
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++)
    scanf("%d%d%d%d", &tr[i].p, &tr[i].h, &tr[i].l, &tr[i].r);
  for (int i = 0; i < m; i++) scanf("%d%d", &ji[i].p, &ji[i].v);
  sort(ji, ji + m);
  for (int i = 0; i < m; i++) v.push_back(ji[i].p);
  build(0, m - 1, 1);
  for (int i = 0; i < n; i++) {
    int pl = low(tr[i].p - tr[i].h), pr = low(tr[i].p) - 1;
    if (pl <= pr) modify(pl, pr, (100.0 - tr[i].l) / 100, 0, m - 1, 1);
    pl = up(tr[i].p);
    pr = up(tr[i].p + tr[i].h) - 1;
    if (pl <= pr) modify(pl, pr, (100.0 - tr[i].r) / 100, 0, m - 1, 1);
  }
  printf("%.10lf\n", sum[1]);
}
