#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
struct Tree {
  long long int a, h, l, r;
};
Tree tree[maxn];
struct Mush {
  long long int b, z;
  Mush() {
    b = 0;
    z = 0;
  };
  Mush(long long int a, long long int x) : b(a), z(x) {}
};
Mush mush[maxn];
double Left[maxn], Right[maxn];
int cmp1(const Tree& t1, const Tree& t2) { return t1.a < t2.a; }
int cmp2(const Mush& t1, const Mush& t2) { return t1.b < t2.b; }
double solveleft(int n, int m) {
  int pos = 0;
  priority_queue<pair<int, int>, vector<pair<int, int> >,
                 greater<pair<int, int> > >
      pq;
  double p = 1;
  double ret = 0;
  for (int i = 0; i < m; i++) {
    while (pos < n && tree[pos].a < mush[i].b) {
      pq.push(pair<int, int>(tree[pos].h + tree[pos].a, pos));
      p *= (100.0 - (double)tree[pos].r) * 1.0 / 100.0;
      while (!pq.empty() && pq.top().first < mush[i].b) {
        int c = pq.top().second;
        pq.pop();
        p /= (100.0 - (double)tree[c].r) * 1.0 / 100.0;
      }
      pos++;
    }
    while (!pq.empty() && pq.top().first < mush[i].b) {
      int c = pq.top().second;
      pq.pop();
      p /= (100.0 - (double)tree[c].r) * 1.0 / 100.0;
    }
    Left[i] = p;
  }
  return ret;
}
double solveright(int n, int m) {
  int pos = n - 1;
  priority_queue<pair<int, int> > pq;
  double p = 1;
  double ret = 0;
  for (int i = m - 1; i >= 0; i--) {
    while (pos >= 0 && tree[pos].a > mush[i].b) {
      pq.push(pair<int, int>(tree[pos].a - tree[pos].h, pos));
      p *= (100.0 - (double)tree[pos].l) * 1.0 / 100.0;
      while (!pq.empty() && pq.top().first > mush[i].b) {
        int c = pq.top().second;
        pq.pop();
        p /= (100.0 - (double)tree[c].l) * 1.0 / 100.0;
      }
      pos--;
    }
    while (!pq.empty() && pq.top().first > mush[i].b) {
      int c = pq.top().second;
      pq.pop();
      p /= (100.0 - (double)tree[c].l) * 1.0 / 100.0;
    }
    Right[i] = p;
  }
  return ret;
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> tree[i].a >> tree[i].h >> tree[i].l >> tree[i].r;
  }
  sort(tree, tree + n, cmp1);
  for (int i = 0; i < m; i++) {
    cin >> mush[i].b >> mush[i].z;
  }
  sort(mush, mush + m, cmp2);
  for (int i = 0; i < n; i++) {
    if (tree[i].r == 100) {
      int t = lower_bound(mush, mush + m, Mush(tree[i].a + 1, 0), cmp2) - mush;
      int tt =
          upper_bound(mush, mush + m, Mush(tree[i].a + tree[i].h, 0), cmp2) -
          mush;
      for (int k = t; k < tt; k++) mush[k].z = 0;
      tree[i].r = 0;
    }
    if (tree[i].l == 100) {
      int t = upper_bound(mush, mush + m, Mush(tree[i].a - 1, 0), cmp2) - mush;
      int tt =
          lower_bound(mush, mush + m, Mush(tree[i].a - tree[i].h, 0), cmp2) -
          mush;
      for (int k = tt; k < t; k++) mush[k].z = 0;
      tree[i].l = 0;
    }
  }
  double ans = 0;
  solveright(n, m);
  solveleft(n, m);
  for (int i = 0; i < m; i++) {
    ans += Left[i] * Right[i] * (double)mush[i].z;
  }
  printf("%.6f", ans);
  return 0;
}
