#include <bits/stdc++.h>
using namespace std;
template <class T>
T min(T a, T b, T c) {
  return min(a, min(b, c));
}
template <class T>
T max(T a, T b, T c) {
  return max(a, max(b, c));
}
template <class T>
void setmin(T& a, T b) {
  if (b < a) a = b;
}
template <class T>
void setmax(T& a, T b) {
  if (b > a) a = b;
}
const int MAXN = 100100;
const int MAXM = 1 << 14;
int n, m, a[MAXN], h[MAXN], l[MAXN], r[MAXN];
pair<int, int> arr[MAXM];
bool cmp1(pair<int, int> p, int i) { return p.first < i; }
bool cmp2(int i, pair<int, int> p) { return i < p.first; }
double tree[2 * MAXM], lazy[2 * MAXM];
void init(int cur, int lt, int rt) {
  lazy[cur] = 1;
  if (lt + 1 == rt)
    tree[cur] = arr[lt].second;
  else {
    int mid = (lt + rt) / 2;
    init(2 * cur, lt, mid);
    init(2 * cur + 1, mid, rt);
  }
}
void down(int cur, int lt, int rt) {
  if (lazy[cur] != 1) {
    if (lt + 1 != rt) {
      lazy[2 * cur] *= lazy[cur];
      lazy[2 * cur + 1] *= lazy[cur];
      lazy[cur] = 1;
    } else
      tree[cur] *= lazy[cur], lazy[cur] = 1;
  }
}
void update(int cur, int lt, int rt, int ql, int qr, double v) {
  down(cur, lt, rt);
  if (rt <= ql || lt >= qr)
    return;
  else if (lt >= ql && rt <= qr) {
    lazy[cur] = v;
    down(cur, lt, rt);
  } else {
    int mid = (lt + rt) / 2;
    update(2 * cur, lt, mid, ql, qr, v);
    update(2 * cur + 1, mid, rt, ql, qr, v);
  }
}
double query(int cur, int lt, int rt, int p) {
  down(cur, lt, rt);
  if (lt + 1 == rt)
    return tree[cur];
  else {
    int mid = (lt + rt) / 2;
    if (p < mid)
      return query(2 * cur, lt, mid, p);
    else
      return query(2 * cur + 1, mid, rt, p);
  }
}
int main() {
  ios ::sync_with_stdio(0);
  if (fopen("input.txt", "r")) freopen("input.txt", "r", stdin);
  cin >> n >> m;
  for (int i = 0; i < n; i++) cin >> a[i] >> h[i] >> l[i] >> r[i];
  for (int i = 0; i < m; i++) cin >> arr[i].first >> arr[i].second;
  sort(arr, arr + m);
  init(1, 0, m);
  for (int i = 0; i < n; i++) {
    int lt, rt;
    lt = lower_bound(arr, arr + m, a[i] - h[i], cmp1) - arr;
    rt = upper_bound(arr, arr + m, a[i] - 1, cmp2) - arr;
    update(1, 0, m, lt, rt, (100. - l[i]) / 100);
    lt = lower_bound(arr, arr + m, a[i] + 1, cmp1) - arr;
    rt = upper_bound(arr, arr + m, a[i] + h[i], cmp2) - arr;
    update(1, 0, m, lt, rt, (100. - r[i]) / 100);
  }
  double ans = 0;
  for (int i = 0; i < m; i++) ans += query(1, 0, m, i);
  cout << fixed << setprecision(10) << ans << '\n';
  return 0;
}
