#include <bits/stdc++.h>
using namespace std;
struct Segment {
  int l, r;
  double val;
  bool flag;
} T[4 * 320000];
int n, m;
int v[320000], N;
struct Tree {
  int l, mid, r, h;
  double pl, pr;
} tree[100050];
int room_pos[10050];
double room_power[10050];
void Down(int u) {
  T[u].flag = 0;
  T[u + u].val *= T[u].val;
  T[u + u].flag = 1;
  T[u + u + 1].val *= T[u].val;
  T[u + u + 1].flag = 1;
  T[u].val = 1;
}
void Create(int u, int l, int r) {
  T[u].l = l, T[u].r = r, T[u].flag = 0, T[u].val = 1;
  if (l == r) return;
  int mid = (l + r) >> 1;
  Create(u + u, l, mid);
  Create(u + u + 1, mid + 1, r);
}
void Update(int u, int l, int r, double val) {
  if (l <= T[u].l && T[u].r <= r) {
    T[u].val *= val;
    T[u].flag = 1;
    return;
  }
  if (T[u].flag) {
    Down(u);
  }
  if (r <= T[u + u].r)
    Update(u + u, l, r, val);
  else if (l >= T[u + u + 1].l)
    Update(u + u + 1, l, r, val);
  else {
    Update(u + u, l, T[u + u].r, val);
    Update(u + u + 1, T[u + u + 1].l, r, val);
  }
}
double get_val(int u, int pos) {
  if (T[u].l == T[u].r) return T[u].val;
  if (T[u].flag) Down(u);
  if (pos <= T[u + u].r)
    return get_val(u + u, pos);
  else
    return get_val(u + u + 1, pos);
}
int main() {
  int i;
  while (cin >> n >> m) {
    N = 0;
    for (i = 1; i <= n; ++i) {
      int pos, h;
      double pl, pr;
      scanf("%d%d%lf%lf", &pos, &h, &pl, &pr);
      tree[i].l = pos - h, tree[i].mid = pos, tree[i].r = pos + h;
      tree[i].h = h;
      tree[i].pl = pl / 100, tree[i].pr = pr / 100;
      v[++N] = pos - h, v[++N] = pos, v[++N] = pos + h;
    }
    for (i = 1; i <= m; ++i) {
      scanf("%d%lf", room_pos + i, room_power + i);
      v[++N] = room_pos[i];
    }
    sort(v + 1, v + 1 + N);
    N = unique(v + 1, v + 1 + N) - v - 1;
    for (i = 1; i <= n; ++i) {
      tree[i].l = lower_bound(v + 1, v + 1 + N, tree[i].l) - v;
      tree[i].mid = lower_bound(v + 1, v + 1 + N, tree[i].mid) - v;
      tree[i].r = lower_bound(v + 1, v + 1 + N, tree[i].r) - v;
    }
    for (i = 1; i <= m; ++i) {
      room_pos[i] = lower_bound(v + 1, v + 1 + N, room_pos[i]) - v;
    }
    Create(1, 1, N);
    for (i = 1; i <= n; ++i) {
      if (tree[i].l > tree[i].mid - 1)
        while (1)
          ;
      Update(1, tree[i].l, tree[i].mid - 1, (1 - tree[i].pl));
      if (tree[i].mid + 1 > tree[i].r)
        while (1)
          ;
      Update(1, tree[i].mid + 1, tree[i].r, (1 - tree[i].pr));
    }
    double sum = 0;
    for (i = 1; i <= m; ++i) {
      sum += get_val(1, room_pos[i]) * room_power[i];
    }
    printf("%.6lf\n", sum);
  }
}
