#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
bool DEBUG = false;
using ll = long long;
using ull = unsigned long long;
int MAXINT = 2e9;
ll MAXLL = 9e18;
struct tree {
  int l;
  int r;
  tree* lp = nullptr;
  tree* rp = nullptr;
  double step_val = 1.0;
} __attribute__((packed));
tree c[9000000];
int ci = 1;
void upd(tree* now, int l, int r, double val) {
  if (now->l > r || now->r < l) {
  } else if (now->l >= l && now->r <= r) {
    now->step_val *= val;
  } else {
    if (now->lp == nullptr) {
      now->lp = &(c[ci]);
      now->rp = &(c[ci + 1]);
      ci += 2;
      if (now->r - now->l == 1) {
        now->lp->l = now->lp->r = now->l;
        now->rp->l = now->rp->r = now->r;
      } else {
        int mid = (now->l + now->r) / 2;
        now->lp->l = now->l;
        now->lp->r = mid;
        now->rp->l = mid + 1;
        now->rp->r = now->r;
      }
    }
    upd(now->lp, l, r, val);
    upd(now->rp, l, r, val);
  }
}
double take(tree* now, int pos) {
  if (now->lp == nullptr)
    return now->step_val;
  else if (now->lp->r >= pos)
    return now->step_val * take(now->lp, pos);
  else
    return now->step_val * take(now->rp, pos);
}
int main() {
  {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout << setprecision(10) << fixed;
  }
  c[0].l = -1e9 - 10;
  c[0].r = 1e9 + 10;
  int n, m;
  cin >> n >> m;
  for (int i = (0); i < (int)(n); ++i) {
    int pos, h;
    double probl, probr;
    cin >> pos >> h >> probl >> probr;
    probl = (100.0 - probl) / 100.0;
    probr = (100.0 - probr) / 100.0;
    upd(&(c[0]), pos - h, pos - 1, probl);
    upd(&(c[0]), pos + 1, pos + h, probr);
  }
  double ans = 0.0l;
  for (int i = (0); i < (int)(m); ++i) {
    int pos;
    double val;
    cin >> pos >> val;
    ans += take(&(c[0]), pos) * val;
  }
  cout << ans;
}
