#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
struct Tree {
  int x, h, l, r;
};
struct Mush {
  int x, c;
};
Tree n[maxn];
Mush m[maxn];
double t[maxn * 4];
int N, M;
bool sort_m(const Mush& p, const Mush& q) { return p.x < q.x; }
int dich(int X) {
  int L = 1, R = M;
  for (; L <= R;) {
    int Mid = (L + R) >> 1;
    if (m[Mid].x >= X)
      R = Mid - 1;
    else
      L = Mid + 1;
  }
  return L;
}
void cover(int p, int tl, int tr, int nl, int nr, double T) {
  if (nr <= nl) return;
  if (tl == nl && tr == nr) {
    t[p] *= T;
    return;
  }
  int tm = (tl + tr) >> 1, q = p << 1, r = q ^ 1;
  if (nr <= tm)
    cover(q, tl, tm, nl, nr, T);
  else if (nl >= tm)
    cover(r, tm, tr, nl, nr, T);
  else {
    cover(q, tl, tm, nl, tm, T);
    cover(r, tm, tr, tm, nr, T);
  }
}
double search(int p, int tl, int tr, int lo) {
  if (tl + 1 == tr) return t[p];
  int tm = (tl + tr) >> 1, q = p << 1, r = q ^ 1;
  if (lo < tm)
    return search(q, tl, tm, lo);
  else
    return search(r, tm, tr, lo);
}
int main() {
  scanf("%d%d", &N, &M);
  for (int i = 1; i <= N; ++i)
    scanf("%d%d%d%d", &n[i].x, &n[i].h, &n[i].l, &n[i].r);
  for (int i = 1; i <= M; ++i) scanf("%d%d", &m[i].x, &m[i].c);
  sort(m + 1, m + M + 1, sort_m);
  for (int i = 1; i <= M * 4; ++i) t[i] = 1;
  for (int i = 1, L, R; i <= N; ++i) {
    L = dich(n[i].x - n[i].h);
    R = dich(n[i].x);
    cover(1, 1, M + 1, L, R, (100 - n[i].l) / 100.0);
    L = dich(n[i].x + 1);
    R = dich(n[i].x + n[i].h + 1);
    cover(1, 1, M + 1, L, R, (100 - n[i].r) / 100.0);
  }
  for (int i = 1; i <= M * 2; ++i) {
    t[i * 2] *= t[i];
    t[i * 2 + 1] *= t[i];
  }
  double Ans = 0;
  for (int i = 1; i <= M; ++i) Ans += search(1, 1, M + 1, i) * m[i].c;
  printf("%.5lf\n", Ans);
  return 0;
}
