#include <bits/stdc++.h>
const int N = 1e5 + 7, M = 1e4 + 7;
using namespace std;
int n, m, xi[N], hi[N], li[N * 5], gs, x_[N];
double Li[N], Ri[N], now[N], T[N * 5 * 4], mo[N];
void Init() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%d%d%lf%lf", xi + i, hi + i, Li + i, Ri + i);
    li[(i - 1) * 4 + 1] = xi[i] - hi[i];
    li[(i - 1) * 4 + 2] = xi[i] - 1;
    li[(i - 1) * 4 + 3] = xi[i] + 1;
    li[(i - 1) * 4 + 4] = xi[i] + hi[i];
  }
  for (int i = 1; i <= m; ++i) {
    scanf("%d%lf", &x_[i], &mo[i]);
    li[n * 4 + i] = x_[i];
  }
  sort(li + 1, li + 1 + n * 4 + m);
  gs = 1;
  ;
  for (int i = 2; i <= n * 4 + m; ++i)
    if (li[i] != li[gs]) li[++gs] = li[i];
}
void push_down(int num) {
  T[num << 1] *= T[num];
  T[num << 1 | 1] *= T[num];
  T[num] = 1;
}
void updata(int num, int l, int r, int L, int R, double ad) {
  if (l >= L && r <= R) {
    T[num] *= ad;
    return;
  }
  push_down(num);
  int mid = (l + r) >> 1;
  if (L <= mid) updata(num << 1, l, mid, L, R, ad);
  if (R > mid) updata(num << 1 | 1, mid + 1, r, L, R, ad);
}
double query(int num, int l, int r, int pos) {
  if (l == r) return T[num];
  push_down(num);
  int mid = (l + r) >> 1;
  if (pos <= mid)
    return query(num << 1, l, mid, pos);
  else
    return query(num << 1 | 1, mid + 1, r, pos);
}
void Solve() {
  for (int i = 1; i <= gs * 4; ++i) T[i] = 1;
  for (int i = 1; i <= n; ++i) {
    int l = lower_bound(li + 1, li + 1 + gs, xi[i] - hi[i]) - li;
    int r = lower_bound(li + 1, li + 1 + gs, xi[i] - 1) - li;
    updata(1, 1, gs, l, r, 1 - Li[i] / 100);
    l = lower_bound(li + 1, li + 1 + gs, xi[i] + 1) - li;
    r = lower_bound(li + 1, li + 1 + gs, xi[i] + hi[i]) - li;
    updata(1, 1, gs, l, r, 1 - Ri[i] / 100);
  }
  int a;
  double b, ans = 0.00;
  for (int i = 1; i <= m; ++i) {
    int pos = lower_bound(li + 1, li + 1 + gs, x_[i]) - li;
    ans += mo[i] * query(1, 1, gs, pos);
  }
  printf("%f\n", ans);
}
int main() {
  Init();
  Solve();
  return 0;
}
