#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
long double data[4 * MAXN];
int h[MAXN], a[MAXN];
int le[MAXN], ri[MAXN];
int help[MAXN];
pair<int, long double> mush[MAXN];
void build(int s = 0, int e = 1e4 + 9, int id = 1) {
  data[id] = 1.0;
  if (e - s < 2) {
    return;
  }
  int mid = (s + e) >> 1;
  build(s, mid, 2 * id + 0);
  build(mid, e, 2 * id + 1);
}
void update(long double x, int l, int r, int s = 0, int e = 1e4 + 9,
            int id = 1) {
  if (e <= l or r <= s) {
    return;
  }
  if (s >= l and e <= r) {
    data[id] *= x;
    return;
  }
  int mid = (s + e) >> 1;
  update(x, l, r, s, mid, 2 * id + 0);
  update(x, l, r, mid, e, 2 * id + 1);
}
long double get(int p, int s = 0, int e = 1e4 + 9, int id = 1) {
  if (e - s < 2) {
    return data[id];
  }
  int mid = (s + e) / 2;
  if (p < mid) {
    return data[id] * get(p, s, mid, 2 * id + 0);
  } else {
    return data[id] * get(p, mid, e, 2 * id + 1);
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  ios::sync_with_stdio(0);
  cout.tie(0);
  long long int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> a[i] >> h[i] >> le[i] >> ri[i];
  }
  for (int i = 0; i < m; i++) {
    cin >> mush[i].first >> mush[i].second;
  }
  sort(mush, mush + m);
  build();
  for (int i = 0; i < m; i++) {
    help[i] = mush[i].first;
  }
  for (int i = 0; i < n; i++) {
    long long int ind1 = lower_bound(help, help + m, a[i] - h[i]) - help;
    long long int ind2 = lower_bound(help, help + m, a[i]) - help;
    if (ind1 != m and ind1 < ind2) {
      update(0.01 * (100 - le[i]), ind1, ind2);
    }
    ind1 = lower_bound(help, help + m, a[i] + 1) - help;
    ind2 = lower_bound(help, help + m, a[i] + h[i] + 1) - help;
    if (ind1 != m and ind1 < ind2) {
      update(0.01 * (100 - ri[i]), ind1, ind2);
    }
  }
  long double answer = .0;
  for (int i = 0; i < m; i++) {
    long double pow = mush[i].second;
    long double now = get(i);
    answer += now * pow;
  }
  cout << fixed << answer << endl;
}
