#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
struct Entity {
  int x, idx;
  Entity();
  Entity(int x, int idx) : x(x), idx(idx) {}
  bool operator<(const Entity &p) const { return x > p.x; }
};
struct Line {
  int l, r;
  int p;
  void set(int l, int r, int p) {
    this->l = l;
    this->r = r;
    this->p = p;
  }
  bool operator<(const Line &p) const { return l < p.l; }
} line[2 * MAXN];
struct Mushroom {
  int pos, val;
  bool operator<(const Mushroom &p) const { return pos < p.pos; }
} mush[MAXN];
priority_queue<Entity> heap;
int hit_tot[MAXN];
int n, m;
void init() {
  scanf("%d%d", &n, &m);
  for (int x, h, pl, pr, i = 0; i < n; ++i) {
    scanf("%d%d%d%d", &x, &h, &pl, &pr);
    line[2 * i].set(x - h, x - 1, 100 - pl);
    line[2 * i + 1].set(x + 1, x + h, 100 - pr);
  }
  for (int i = 0; i < m; ++i) scanf("%d%d", &mush[i].pos, &mush[i].val);
}
void solve() {
  n <<= 1;
  sort(line, line + n);
  sort(mush, mush + m);
  while (!heap.empty()) heap.pop();
  double ans = 0.0;
  double p = 0.0;
  int zero_tot = 0;
  for (int j = 0, i = 0; i < m; ++i) {
    for (; line[j].l <= mush[i].pos && j < n; ++j) {
      heap.push(Entity(line[j].r, j));
      if (line[j].p == 0)
        ++zero_tot;
      else
        p += log(line[j].p / 100.0);
    }
    for (int idx; !heap.empty() && heap.top().x < mush[i].pos;) {
      idx = heap.top().idx;
      if (line[idx].p == 0)
        --zero_tot;
      else
        p -= log(line[idx].p / 100.0);
      heap.pop();
    }
    if (zero_tot == 0) ans += mush[i].val * exp(p);
  }
  printf("%.5f\n", ans);
}
int main() {
  init();
  solve();
  return 0;
}
