#include <bits/stdc++.h>
using namespace std;
int getint() {
  unsigned int c;
  int x = 0;
  while (((c = getchar()) - '0') >= 10) {
    if (c == '-') return -getint();
    if (!~c) exit(0);
  }
  do {
    x = (x << 3) + (x << 1) + (c - '0');
  } while (((c = getchar()) - '0') < 10);
  return x;
}
const int N = 100000, M = 10000;
int n, m;
int treePos[N], treeLeft[N], treeRight[N];
double leftProb[N], rightProb[N];
int mushroomPos[M], mushroomPower[M];
int xs[N * 3 + M], ns;
map<int, int> compresser;
struct Node {
  double p;
  Node() { p = 1; }
};
struct SegmentTree {
  static const int SIZE = 310000 * 20;
  Node data[SIZE];
  int treeSize, numLeaf;
  SegmentTree(){};
  void init(int n) {
    for (numLeaf = 1; numLeaf < n; numLeaf <<= 1) continue;
    treeSize = numLeaf << 1;
    fill(data, data + treeSize, Node());
  }
  void set_leaf(int pos, const Node& nd) { data[pos + numLeaf] = nd; }
  void set(int srt, int end, double prob, int pos = 0, int a = 0, int b = 0) {
    if (!pos) pos = 1, a = 0, b = numLeaf - 1;
    srt = max(a, srt), end = min(b, end);
    if (end < srt) return;
    if (a == srt and b == end) {
      data[pos].p *= (1 - prob);
      return;
    }
    int md = a + b >> 1;
    set(srt, end, prob, pos << 1, a, md);
    set(srt, end, prob, pos << 1 | 1, md + 1, b);
  }
  double get(int srt, int end, int pos = 0, int a = 0, int b = 0) {
    if (!pos) pos = 1, a = 0, b = numLeaf - 1;
    srt = max(a, srt), end = min(b, end);
    if (end < srt) return 1;
    if (a == srt and b == end) return data[pos].p;
    int md = a + b >> 1;
    double res = data[pos].p;
    res *= get(srt, end, pos << 1, a, md);
    res *= get(srt, end, pos << 1 | 1, md + 1, b);
    return res;
  }
};
SegmentTree sgt;
int main() {
  int i, j, tcc, tc = 1 << 28;
  for (tcc = 0; tcc < tc; tcc++) {
    n = getint(), m = getint(), ns = 0;
    for (i = 0; i < n; i++) {
      int h;
      treePos[i] = getint();
      h = getint();
      treeLeft[i] = treePos[i] - h;
      treeRight[i] = treePos[i] + h;
      leftProb[i] = getint() / 100.0;
      rightProb[i] = getint() / 100.0;
      xs[ns++] = treePos[i];
      xs[ns++] = treeLeft[i];
      xs[ns++] = treeRight[i];
    }
    for (i = 0; i < m; i++) {
      mushroomPos[i] = getint();
      mushroomPower[i] = getint();
      xs[ns++] = mushroomPos[i];
    }
    sort(xs, xs + ns);
    ns = unique(xs, xs + ns) - xs;
    compresser.clear();
    for (i = 0; i < ns; i++) compresser[xs[i]] = i;
    for (i = 0; i < n; i++) {
      treePos[i] = compresser[treePos[i]];
      treeLeft[i] = compresser[treeLeft[i]];
      treeRight[i] = compresser[treeRight[i]];
    }
    for (i = 0; i < m; i++) {
      mushroomPos[i] = compresser[mushroomPos[i]];
    }
    sgt.init(ns);
    for (i = 0; i < n; i++) {
      sgt.set(treeLeft[i], treePos[i] - 1, leftProb[i]);
      sgt.set(treePos[i] + 1, treeRight[i], rightProb[i]);
    }
    double res = 0;
    for (i = 0; i < m; i++) {
      res += sgt.get(mushroomPos[i], mushroomPos[i]) * mushroomPower[i];
    }
    printf("%.10lf\n", res);
  }
  return 0;
}
