#include <bits/stdc++.h>
using namespace std;
int a[1000001], b[1000001], h[1000001];
double l[1000001], r[1000001], tree[4000001], z[1000001];
map<int, int> assign;
vector<int> v;
void build(int node, int a, int b) {
  tree[node] = 1.0;
  if (a != b) {
    int mid = (a + b) / 2;
    build(2 * node, a, mid);
    build(2 * node + 1, mid + 1, b);
  }
}
void update(int node, int a, int b, int l, int r, double val) {
  if (a > b || a > r || b < l) return;
  if (a >= l && b <= r) {
    tree[node] *= val;
    return;
  }
  int mid = (a + b) / 2;
  if (a != b) {
    update(2 * node, a, mid, l, r, val);
    update(2 * node + 1, mid + 1, b, l, r, val);
  }
}
double query(int node, int a, int b, int l, int r) {
  if (a > b || a > r || b < l) return 1.0;
  if (a >= l && b <= r) return tree[node];
  int mid = (a + b) / 2;
  return tree[node] * query(2 * node, a, mid, l, r) *
         query(2 * node + 1, mid + 1, b, l, r);
}
int main() {
  cout << fixed << setprecision(10);
  int i, j, n, m, x, y, size;
  double ans = 0.0;
  cin >> n >> m;
  for (i = 1; i <= n; i++) {
    scanf("%d %d %lf %lf", &a[i], &h[i], &l[i], &r[i]);
    v.push_back(a[i] - 1);
    v.push_back(a[i] + 1);
    v.push_back(a[i] + h[i]);
    v.push_back(a[i] - h[i]);
    l[i] /= 100.0;
    ;
    r[i] /= 100.0;
  }
  for (i = 1; i <= m; i++) {
    scanf("%d %lf", &b[i], &z[i]);
    v.push_back(b[i]);
  }
  sort(v.begin(), v.end());
  for (i = 0; i < v.size(); i++) assign[v[i]] = i + 1;
  size = v.size();
  size++;
  build(1, 1, size);
  for (i = 1; i <= n; i++) {
    update(1, 1, size, assign[a[i] + 1], assign[a[i] + h[i]], 1 - r[i]);
    update(1, 1, size, assign[a[i] - h[i]], assign[a[i] - 1], 1 - l[i]);
  }
  for (i = 1; i <= m; i++)
    ans += query(1, 1, size, assign[b[i]], assign[b[i]]) * z[i];
  cout << ans;
  return 0;
}
