#include <bits/stdc++.h>
using namespace std;
class SegmentTree {
 public:
  vector<double> tSumm;
  vector<double> mod;
  int n;
  SegmentTree(int v) {
    n = v;
    tSumm.resize(4 * n);
    mod.resize(4 * n);
    build(1, 1, n);
  }
  void build(int v, int l, int r) {
    if (l == r) {
      tSumm[v] = 1;
      mod[v] = 1;
    } else {
      int tm = (l + r) / 2;
      build(v * 2, l, tm);
      build(v * 2 + 1, tm + 1, r);
      tSumm[v] = 1;
      mod[v] = 1;
    }
  }
  double sum(int l, int r, int v = 1, int tl = 1, int tr = -1) {
    if (l > r) return 0;
    if (tr == -1) tr = n;
    if (l == tl && r == tr) return tSumm[v];
    push(v, tl, tr);
    int tm = (tl + tr) / 2;
    return sum(l, min(r, tm), v * 2, tl, tm) +
           sum(max(l, tm + 1), r, v * 2 + 1, tm + 1, tr);
  }
  void push(int v, int tl, int tr) {
    if (mod[v] != 1 && v * 2 + 1 < (int)tSumm.size()) {
      mod[v * 2] *= mod[v];
      mod[v * 2 + 1] *= mod[v];
      tSumm[v * 2] *= mod[v];
      tSumm[v * 2 + 1] *= mod[v];
      mod[v] = 1;
    }
  }
  void Assign(int l, int r, double val, int v = 1, int tl = 1, int tr = -1) {
    if (tr == -1) tr = n;
    if (l <= tl && tr <= r) {
      tSumm[v] *= val;
      mod[v] *= val;
      return;
    }
    if (tr < l || r < tl) return;
    push(v, tl, tr);
    int tm = (tl + tr) / 2;
    Assign(l, r, val, v * 2, tl, tm);
    Assign(l, r, val, v * 2 + 1, tm + 1, tr);
  }
};
int main() {
  int n, m;
  cin >> n >> m;
  vector<int> a, h, l, r;
  vector<int> pressF;
  a.push_back(-1);
  h.push_back(-1);
  l.push_back(-1);
  r.push_back(-1);
  pressF.push_back(-2000000000 - 10);
  for (int i = 1; i <= n; i++) {
    int b, c, d, e;
    cin >> b >> c >> d >> e;
    a.push_back(b);
    h.push_back(c);
    l.push_back(d);
    r.push_back(e);
    pressF.push_back(a[i] - h[i]);
    pressF.push_back(a[i] + h[i]);
    pressF.push_back(a[i] - 1);
    pressF.push_back(a[i] + 1);
  }
  vector<int> grib, w;
  grib.push_back(-1);
  w.push_back(-1);
  for (int i = 1; i <= m; i++) {
    int b, c;
    cin >> b >> c;
    grib.push_back(b);
    w.push_back(c);
    pressF.push_back(grib[i]);
  }
  sort(pressF.begin(), pressF.end());
  pressF.resize(unique(pressF.begin(), pressF.end()) - pressF.begin());
  map<int, int> mapa;
  for (int i = 1; i < pressF.size(); i++) mapa[pressF[i]] = i;
  SegmentTree ST((int)pressF.size() - 1);
  for (int i = 1; i <= n; i++) {
    ST.Assign(mapa[a[i] - h[i]], mapa[a[i] - 1], 1.0 - double(l[i]) / 100);
    ST.Assign(mapa[a[i] + 1], mapa[a[i] + h[i]], 1.0 - double(r[i]) / 100);
  }
  double ans = 0;
  for (int i = 1; i <= m; i++)
    ans += ST.sum(mapa[grib[i]], mapa[grib[i]]) * w[i];
  cout << setprecision(12);
  cout << ans;
  return 0;
}
