#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct node {
  int rt, l, r;
  double p;
  int mid() { return (l + r) >> 1; }
  inline void init(int l1, int r1) {
    l = l1;
    r = r1;
    p = 1;
  }
} tree[N << 2];
int b[N], v[N];
void Build(int rt, int l, int r) {
  tree[rt].init(l, r);
  if (l == r) return;
  Build((rt << 1), l, tree[rt].mid());
  Build((rt << 1 | 1), tree[rt].mid() + 1, r);
}
void Update(int rt, int l, int r, int lrank, int rrank, double p) {
  if (lrank <= l && r <= rrank) {
    tree[rt].p *= p;
    return;
  }
  if (tree[rt].mid() >= rrank)
    Update((rt << 1), l, tree[rt].mid(), lrank, rrank, p);
  else if (tree[rt].mid() < lrank)
    Update((rt << 1 | 1), tree[rt].mid() + 1, r, lrank, rrank, p);
  else {
    Update((rt << 1), l, tree[rt].mid(), lrank, rrank, p);
    Update((rt << 1 | 1), tree[rt].mid() + 1, r, lrank, rrank, p);
  }
}
double Query(int rt, int l, int r, int rank) {
  if (l == r) return tree[rt].p;
  if (tree[rt].mid() >= rank)
    return tree[rt].p * Query((rt << 1), l, tree[rt].mid(), rank);
  else
    return tree[rt].p * Query((rt << 1 | 1), tree[rt].mid() + 1, r, rank);
}
void solve() {
  int n, m;
  while (~scanf("%d%d", &n, &m)) {
    vector<pair<int, int> > ld, rd;
    vector<int> lp, rp;
    for (int i = 1; i <= n; ++i) {
      int a, h, l, r;
      scanf("%d%d%d%d", &a, &h, &l, &r);
      ld.push_back(make_pair(a - h, a - 1));
      rd.push_back(make_pair(a + 1, a + h));
      lp.push_back(l);
      rp.push_back(r);
    }
    vector<int> rank;
    for (int i = 1; i <= m; ++i) {
      scanf("%d%d", b + i, v + i);
      rank.push_back(b[i]);
    }
    sort(rank.begin(), rank.end());
    rank.erase(unique(rank.begin(), rank.end()), rank.end());
    int len = rank.size();
    Build(1, 1, m);
    for (int i = 0; i < n; ++i) {
      int lrank =
          lower_bound(rank.begin(), rank.end(), ld[i].first) - rank.begin() + 1;
      int rrank =
          upper_bound(rank.begin(), rank.end(), ld[i].second) - rank.begin();
      double p1 = 1.0 - lp[i] / 100.0;
      if (lrank <= rrank) Update(1, 1, len, lrank, rrank, p1);
      lrank =
          lower_bound(rank.begin(), rank.end(), rd[i].first) - rank.begin() + 1;
      rrank =
          upper_bound(rank.begin(), rank.end(), rd[i].second) - rank.begin();
      p1 = 1.0 - rp[i] / 100.0;
      if (lrank <= rrank) Update(1, 1, len, lrank, rrank, p1);
    }
    double excp = 0;
    for (int i = 1; i <= m; ++i) {
      int rankme =
          lower_bound(rank.begin(), rank.end(), b[i]) - rank.begin() + 1;
      excp += Query(1, 1, m, rankme) * (double)v[i];
    }
    printf("%.10f\n", excp);
  }
}
int main() {
  solve();
  return 0;
}
