#include <bits/stdc++.h>
const long long oo = 0x3f3f3f3f;
const int _cnt = 1000 * 1000;
const int _p = 1000 * 1000 * 1000 + 7;
long long o(long long x) { return x % _p; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
using namespace std;
void file_put() {
  freopen("filename.in", "r", stdin);
  freopen("filename.out", "w", stdout);
}
struct treetype {
  int x, h, l, r, no;
  bool s;
};
treetype T[200005];
struct ptype {
  int x;
  ptype() {}
  ptype(int _x) { x = _x; }
  friend bool operator<(const ptype& p1, const ptype& p2) {
    return T[p1.x].x + T[p1.x].h > T[p2.x].x + T[p2.x].h;
  }
};
struct qtype {
  int x;
  qtype() {}
  qtype(int _x) { x = _x; }
  friend bool operator<(const qtype& p1, const qtype& p2) {
    return T[p1.x].x - T[p1.x].h < T[p2.x].x - T[p2.x].h;
  }
};
bool cmp(const treetype& t1, const treetype& t2) {
  return (t1.x < t2.x) || (t1.x == t2.x && t1.s > t2.s);
}
bool cmp1(const treetype& t1, const treetype& t2) {
  return (t1.x < t2.x) || (t1.x == t2.x && t1.s < t2.s);
}
priority_queue<ptype> Q;
priority_queue<qtype> W;
int n, m, cnt0 = 0;
double p[200005], P = 1, q[200005], L = 1, ans = 0;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d%d", &T[i].x, &T[i].h, &T[i].l, &T[i].r);
    T[i].no = i;
    T[i].s = false;
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &T[n + i].x, &T[n + i].h);
    T[n + i].no = i;
    T[n + i].s = true;
  }
  sort(T + 1, T + n + m + 1, cmp);
  for (int i = 1; i <= n + m; i++) {
    if (!T[i].s) {
      Q.push(ptype(i));
      if (T[i].r == 100)
        cnt0++;
      else
        P *= 1 - ((double)T[i].r / 100);
      while (!Q.empty() && T[Q.top().x].x + T[Q.top().x].h < T[i].x) {
        if (T[Q.top().x].r == 100)
          cnt0--;
        else
          P /= 1 - ((double)T[Q.top().x].r / 100);
        Q.pop();
      }
    }
    if (T[i].s) {
      while (!Q.empty() && T[Q.top().x].x + T[Q.top().x].h < T[i].x) {
        if (T[Q.top().x].r == 100)
          cnt0--;
        else
          P /= 1 - ((double)T[Q.top().x].r / 100);
        Q.pop();
      }
      if (!cnt0)
        p[T[i].no] = P;
      else
        p[T[i].no] = 0;
    }
  }
  sort(T + 1, T + n + m + 1, cmp1);
  cnt0 = 0;
  for (int i = n + m; i >= 1; i--) {
    if (!T[i].s) {
      W.push(qtype(i));
      if (T[i].l == 100)
        cnt0++;
      else
        L *= 1 - ((double)T[i].l / 100);
      while (!W.empty() && T[W.top().x].x - T[W.top().x].h > T[i].x) {
        if (T[W.top().x].l == 100)
          cnt0--;
        else
          L /= 1 - ((double)T[W.top().x].l / 100);
        W.pop();
      }
    }
    if (T[i].s) {
      while (!W.empty() && T[W.top().x].x - T[W.top().x].h > T[i].x) {
        if (T[W.top().x].l == 100)
          cnt0--;
        else
          L /= 1 - ((double)T[W.top().x].l / 100);
        W.pop();
      }
      if (!cnt0)
        q[T[i].no] = L;
      else
        q[T[i].no] = 0;
    }
  }
  for (int i = 1; i <= n + m; i++) {
    if (!T[i].s) continue;
    ans += (T[i].h * p[T[i].no] * q[T[i].no]);
  }
  printf("%.12lf\n", ans);
  return 0;
}
