#include <bits/stdc++.h>
using namespace std;
const long long N = 3e5 + 55;
const long long mod = 1000000007;
double add[N << 2], sum[N << 2];
struct node {
  int pos, h, l, r;
} a[N];
map<int, int> b;
vector<int> v, v2;
int getid(int x) { return lower_bound(v.begin(), v.end(), x) - v.begin() + 1; }
int get_id(int x) { return upper_bound(v.begin(), v.end(), x) - v.begin() + 1; }
int getid2(int x) {
  return lower_bound(v2.begin(), v2.end(), x) - v2.begin() + 1;
}
void PushUp(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; }
void PushDown(int rt, int m, int l, int r) {
  if (fabs(add[rt] - 1) > 0.00001) {
    add[rt << 1] *= add[rt];
    add[rt << 1 | 1] *= add[rt];
    sum[rt << 1] *= add[rt];
    sum[rt << 1 | 1] *= add[rt];
    add[rt] = 1;
  }
}
void build(int l, int r, int rt) {
  add[rt] = 1;
  sum[rt] = 0;
  if (l == r) {
    if (v2[getid2(v[l - 1]) - 1] == v[l - 1]) {
      sum[rt] = b[v[l - 1]];
    } else
      sum[rt] = 0;
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, rt << 1);
  build(m + 1, r, rt << 1 | 1);
  PushUp(rt);
}
void upedit(int L, int R, double c, int l, int r, int rt) {
  if (L <= l && r <= R) {
    add[rt] *= c;
    sum[rt] *= c;
    return;
  }
  int m = (l + r) >> 1;
  PushDown(rt, m, l, r);
  if (L <= m) upedit(L, R, c, l, m, rt << 1);
  if (m < R) upedit(L, R, c, m + 1, r, rt << 1 | 1);
  PushUp(rt);
}
double query(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) {
    return sum[rt];
  }
  int m = (l + r) >> 1;
  PushDown(rt, m, l, r);
  double ret = 0;
  if (L <= m) ret += query(L, R, l, m, rt << 1);
  if (m < R) ret += query(L, R, m + 1, r, rt << 1 | 1);
  return ret;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int n, m, k, kk;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].pos >> a[i].h >> a[i].l >> a[i].r;
    v.push_back(a[i].pos);
    v.push_back(a[i].pos + a[i].h);
    v.push_back(a[i].pos - a[i].h);
  }
  for (int i = 1; i <= m; i++) {
    cin >> k >> kk, v.push_back(k), v2.push_back(k);
    b[k] += kk;
  }
  sort(v.begin(), v.end()), v.erase(unique(v.begin(), v.end()), v.end());
  sort(v2.begin(), v2.end()), v2.erase(unique(v2.begin(), v2.end()), v2.end());
  int sz = v.size();
  build(1, sz, 1);
  for (int i = 1; i <= n; i++) {
    int L = getid(a[i].pos - a[i].h);
    int R = get_id(a[i].pos + a[i].h) - 1;
    int M = getid(a[i].pos);
    if (L < M) {
      upedit(L, M - 1, 1 - a[i].l * 1.0 / 100, 1, sz, 1);
    }
    if (R > M) {
      upedit(M + 1, R, 1 - a[i].r * 1.0 / 100, 1, sz, 1);
    }
  }
  printf("%.5f\n", sum[1]);
  return 0;
}
