#include <bits/stdc++.h>
using namespace std;
struct OP {
  double flag;
  int st, ed, lft;
  OP() {}
  OP(int a, int b, double c, int d) {
    st = a;
    ed = b;
    flag = c;
    lft = d;
  }
};
struct Node {
  double k;
  int left, right, cnt;
  void fun(double tmp) {
    k *= tmp;
    cnt = 1;
  }
} node[100010 << 4];
int B[100010], Z[100010];
vector<OP> op;
vector<int> Y;
map<int, int> H;
void PushUp(int p) {
  if (node[p].cnt) {
    node[(p << 1)].fun(node[p].k);
    node[(p << 1 | 1)].fun(node[p].k);
    node[p].k = 1;
    node[p].cnt = 0;
  }
}
void Build(int l, int r, int p) {
  node[p].left = l;
  node[p].right = r;
  node[p].cnt = 0;
  node[p].k = 1;
  if (l != r) {
    int mid = (l + r) >> 1;
    Build(l, mid, p << 1);
    Build(mid + 1, r, p << 1 | 1);
  }
}
void Update(int L, int R, int p, double flag) {
  int l = node[p].left, r = node[p].right;
  if (L <= l && R >= r)
    node[p].fun(flag);
  else {
    PushUp(p);
    int mid = (l + r) >> 1;
    if (L <= mid) Update(L, R, (p << 1), flag);
    if (R > mid) Update(L, R, (p << 1 | 1), flag);
  }
}
double Query(int m, int p) {
  int l = node[p].left, r = node[p].right;
  if (l == r)
    return node[p].k;
  else {
    PushUp(p);
    int mid = (l + r) >> 1;
    double ans;
    if (m <= mid) ans = Query(m, (p << 1));
    if (m > mid) ans = Query(m, (p << 1 | 1));
    return ans;
  }
}
int main() {
  int n, m;
  while (scanf("%d%d", &n, &m) != EOF) {
    Y.clear();
    H.clear();
    op.clear();
    for (int i = 0; i < n; i++) {
      int a, b, c, d;
      scanf("%d%d%d%d", &a, &b, &c, &d);
      Y.push_back(a - b);
      Y.push_back(a + b);
      Y.push_back(a);
      op.push_back(OP(a - b, a, (100 - c) / 100.0, 1));
      op.push_back(OP(a, a + b, (100 - d) / 100.0, 0));
    }
    for (int i = 0; i < m; i++) {
      scanf("%d%d", &B[i], &Z[i]);
      Y.push_back(B[i]);
    }
    sort((Y).begin(), (Y).end());
    Y.erase(unique((Y).begin(), (Y).end()), Y.end());
    int len = (int)Y.size();
    for (int i = 0; i < len; i++) H[Y[i]] = i;
    Build(0, len - 1, 1);
    for (int i = 0; i < (int)op.size(); i++) {
      if (op[i].lft)
        Update(H[op[i].st], H[op[i].ed] - 1, 1, op[i].flag);
      else
        Update(H[op[i].st] + 1, H[op[i].ed], 1, op[i].flag);
    }
    double res = 0;
    for (int i = 0; i < m; i++) {
      res += Z[i] * Query(H[B[i]], 1);
    }
    printf("%g\n", res);
  }
  return 0;
}
