#include <bits/stdc++.h>
using namespace std;
int main() {
  int nt, nm;
  cin >> nt >> nm;
  int *allints = new int[4 * nt + nm];
  int *TCs = allints;
  int *THs = TCs + nt;
  int *PLs = THs + nt;
  int *PRs = PLs + nt;
  pair<int, double> *allpairs = new pair<int, double>[2 * nt + nm];
  pair<int, double> *trees = allpairs;
  pair<int, double> *mushs = trees + (2 * nt);
  double logp[101];
  logp[0] = 0.0;
  for (int i = 1; i < 100; ++i) logp[i] = log(1.0 - (i / 100.0));
  logp[100] = log(1e-10);
  for (int i = 0; i < nt; ++i) {
    cin >> TCs[i] >> THs[i] >> PLs[i] >> PRs[i];
  }
  for (int i = 0; i < nm; ++i) {
    int p;
    cin >> mushs[i].first >> p;
    mushs[i].second = log((double)p);
  }
  sort(mushs, mushs + nm);
  for (int iPass = 0; iPass < 2; ++iPass) {
    for (int i = 0; i < nt; ++i) {
      trees[i] = pair<int, double>(TCs[i] + (iPass == 0 ? -(THs[i] + 1) : 0),
                                   logp[iPass == 0 ? PLs[i] : PRs[i]]);
      trees[i + nt] = pair<int, double>(TCs[i] + (iPass == 0 ? -1 : THs[i]),
                                        -trees[i].second);
    }
    sort(trees, trees + 2 * nt);
    int iTree = 0;
    int jMush = 0;
    double dp = 0.0;
    while (jMush < nm && iTree < (2 * nt)) {
      if (trees[iTree].first < mushs[jMush].first) {
        dp += trees[iTree++].second;
      } else {
        mushs[jMush++].second += dp;
      }
    }
  }
  double expected = 0.0;
  for (int i = 0; i < nm; ++i) expected += exp(mushs[i].second);
  cout << expected << endl;
  delete[] allints;
  delete[] allpairs;
  return 0;
}
