#include <bits/stdc++.h>
using namespace std;
struct node {
  int a, h;
  double li, ri;
} tree[200003];
struct node1 {
  int b, z;
} mr[200003];
int n, m, pos[200003 * 5];
double p[200003], lazy[200003 << 3];
map<int, int> num;
void push_down(int rt) {
  if (lazy[rt] != 1) {
    lazy[rt << 1] *= lazy[rt];
    lazy[rt << 1 | 1] *= lazy[rt];
    lazy[rt] = 1;
  }
}
void update(int left, int right, int rt, int L, int R, double p) {
  int i;
  if (left >= L && right <= R) {
    lazy[rt] = lazy[rt] * p;
    return;
  }
  push_down(rt);
  int mid = (left + right) >> 1;
  if (L <= mid) update(left, mid, rt << 1, L, R, p);
  if (R > mid) update(mid + 1, right, rt << 1 | 1, L, R, p);
}
double query(int left, int right, int rt, int pos) {
  if (left == right) {
    return lazy[rt];
  }
  push_down(rt);
  int mid = (left + right) >> 1;
  if (mid >= pos)
    return query(left, mid, rt << 1, pos);
  else
    return query(mid + 1, right, rt << 1 | 1, pos);
}
int main() {
  int i, cnt = 0, a, h, li, ri;
  cin >> n >> m;
  for (i = 0; i < n; i++) {
    cin >> a >> h >> li >> ri;
    tree[i].a = a;
    tree[i].h = h;
    tree[i].li = 1 - li / 100.0;
    tree[i].ri = 1 - ri / 100.0;
    pos[cnt++] = a - 1;
    pos[cnt++] = a + 1;
    pos[cnt++] = a - h;
    pos[cnt++] = a + h;
  }
  for (i = 0; i < m; i++) {
    cin >> mr[i].b >> mr[i].z;
    pos[cnt++] = mr[i].b;
  }
  sort(pos, pos + cnt);
  cnt = unique(pos, pos + cnt) - pos;
  for (i = 0; i < cnt; i++) {
    num[pos[i]] = i;
  }
  for (i = 0; i < (cnt << 2); i++) {
    lazy[i] = 1;
  }
  for (i = 0; i < n; i++) {
    update(0, cnt - 1, 1, num[tree[i].a - tree[i].h], num[tree[i].a - 1],
           tree[i].li);
    update(0, cnt - 1, 1, num[tree[i].a + 1], num[tree[i].a + tree[i].h],
           tree[i].ri);
  }
  double ret = 0, tmp;
  for (i = 0; i < m; i++) {
    tmp = query(0, cnt - 1, 1, num[mr[i].b]);
    ret += 1.0 * mr[i].z * tmp;
  }
  printf("%.10lf\n", ret);
}
