#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
long double seg[4 * MAXN], f[MAXN];
vector<pair<pair<int, int>, pair<int, int> > > p;
vector<pair<int, int> > m;
set<pair<int, int> > s;
void upd(int v, int p, long double val, int s, int e) {
  if (e - s < 2) {
    seg[v] = val / 100;
    return;
  }
  int mid = (s + e) / 2;
  if (p < mid)
    upd(2 * v, p, val, s, mid);
  else
    upd(2 * v + 1, p, val, mid, e);
  seg[v] = seg[2 * v] * seg[2 * v + 1];
  return;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m2, ind = 0;
  cin >> n >> m2;
  for (int i = 0; i < n; i++) {
    int x, h, l, r;
    cin >> x >> h >> l >> r;
    p.push_back({{x, h}, {l, r}});
  }
  fill(f, f + MAXN, 1);
  fill(seg, seg + 4 * MAXN, 1);
  sort(p.begin(), p.end());
  for (int i = 0; i < m2; i++) {
    int x, val;
    cin >> x >> val;
    m.push_back({x, val});
  }
  sort(m.begin(), m.end());
  for (int i = 0; i < m2; i++) {
    while (ind < n and p[ind].first.first < m[i].first) {
      s.insert({p[ind].first.first + p[ind].first.second, ind});
      upd(1, ind, 100 - p[ind].second.second, 0, n);
      ind++;
    }
    while (s.size() and s.begin()->first < m[i].first) {
      int id = s.begin()->second;
      upd(1, id, 100, 0, n);
      s.erase(s.begin());
    }
    f[i] *= seg[1];
  }
  ind = n - 1;
  s.clear();
  fill(seg, seg + 4 * MAXN, 1);
  for (int i = m2 - 1; i > -1; i--) {
    while (ind > -1 and p[ind].first.first > m[i].first) {
      s.insert({p[ind].first.first - p[ind].first.second, ind});
      upd(1, ind, 100 - p[ind].second.first, 0, n);
      ind--;
    }
    while (s.size() and s.rbegin()->first > m[i].first) {
      auto itr = s.end();
      itr--;
      upd(1, itr->second, 100, 0, n);
      s.erase(itr);
    }
    f[i] *= seg[1];
  }
  long double ans = 0;
  for (int i = 0; i < m2; i++) ans += f[i] * m[i].second;
  cout << fixed << setprecision(10) << ans << endl;
}
