#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:268435456")
using namespace std;
const string IN_NAME = "input.txt";
const string OUT_NAME = "output.txt";
template <class T>
T abs(T &x) {
  return ((x) >= 0) ? (x) : (-(x));
}
template <class T>
T sqr(T &x) {
  return (x) * (x);
}
template <class T>
T min(T &a, T &b) {
  return ((a) < (b)) ? (a) : (b);
}
template <class T>
T max(T &a, T &b) {
  return ((a) > (b)) ? (a) : (b);
}
int n, m;
struct tree {
  int x, h, pL, pR;
  tree() {}
  bool operator<(const tree &t) const { return x < t.x; }
};
struct mush {
  int x, z;
  mush() {}
  bool operator<(const mush &t) const { return x < t.x; }
};
tree a[100010];
mush b[100010], tmpb[100010];
int binSearch(int x) {
  if (x < b[0].x) return -1;
  if (x > b[m - 1].x) return -m - 1;
  int left = 0, right = m - 1;
  while (right - left > 1) {
    int mid = (left + right) >> 1;
    if (b[mid].x == x) return mid;
    if (b[mid].x < x)
      left = mid + 1;
    else
      right = mid - 1;
  }
  for (int i = max(0, left - 4); i < min(m - 1, right + 3); i++) {
    if (b[i].x < x && x < b[i + 1].x) return -(i + 1) - 1;
  }
  return right;
}
double d[100010];
double db[100010];
int dk;
void multQuery(int left, int right, double p) {
  if (left > right) return;
  int L = left / dk + 1;
  int R = right / dk - 1;
  if (L > R) {
    for (int i = left; i <= right; i++) d[i] *= p;
  } else {
    for (int i = left; i < L * dk; i++) d[i] *= p;
    for (int j = L; j <= R; j++) db[j] *= p;
    for (int i = (R + 1) * dk; i <= right; i++) d[i] *= p;
  }
}
double getQuery(int index) { return d[index] * db[index / dk]; }
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++)
    scanf("%d%d%d%d", &a[i].x, &a[i].h, &a[i].pL, &a[i].pR);
  for (int i = 0; i < m; i++) scanf("%d%d", &tmpb[i].x, &tmpb[i].z);
  sort(a, a + n);
  sort(tmpb, tmpb + m);
  int newM = 0;
  for (int i = 0; i < m; i++) {
    if (i == 0 || tmpb[i - 1].x < tmpb[i].x) {
      b[newM].x = tmpb[i].x;
      b[newM].z = tmpb[i].z;
      newM++;
    } else {
      b[newM - 1].z += tmpb[i].z;
    }
  }
  m = newM;
  for (int i = 0; i < n; i++) a[i].x *= 2;
  for (int i = 0; i < n; i++) a[i].h *= 2;
  for (int i = 0; i < m; i++) b[i].x *= 2;
  dk = (int)sqrt(m + 1e-9);
  for (int i = 0; i < m + 5; i++) {
    d[i] = db[i] = 1;
  }
  for (int i = 0; i < n; i++) {
    int leftIndex = binSearch(a[i].x - a[i].h - 1);
    int rightIndex = binSearch(a[i].x + a[i].h + 1);
    int thisLeftIndex = binSearch(a[i].x - 1);
    int thisRightIndex = binSearch(a[i].x + 1);
    leftIndex = ~leftIndex;
    rightIndex = ~rightIndex;
    thisLeftIndex = ~thisLeftIndex;
    thisRightIndex = ~thisRightIndex;
    multQuery(leftIndex, thisLeftIndex - 1, 1.0 - a[i].pL / 100.0);
    multQuery(thisRightIndex, rightIndex - 1, 1.0 - a[i].pR / 100.0);
  }
  double result = 0;
  for (int i = 0; i < m; i++) {
    result += getQuery(i) * b[i].z;
  }
  printf("%.12f", result);
}
