#include <bits/stdc++.h>
using namespace std;
struct Event {
  int x;
  char type;
  union {
    int z;
    int prob;
  };
};
vector<Event> V;
int Priority[256];
bool operator<(Event a, Event b) {
  if (a.x != b.x) {
    return a.x < b.x;
  }
  return Priority[a.type] < Priority[b.type];
}
void addEvent(int x, char type, int prob) {
  Event e;
  e.x = x;
  e.type = type;
  e.prob = prob;
  V.push_back(e);
}
double mpow(double x, int k) {
  double ret = 1.0;
  for (int i = k; i; i >>= 1, x *= x) {
    if (i & 1) {
      ret *= x;
    }
  }
  return ret;
}
bool Solve(int test) {
  int n, m;
  cin >> n >> m;
  for (int k = 0; k < n; k++) {
    int a, h, l, r;
    cin >> a >> h >> l >> r;
    Event e;
    addEvent(a - h, '[', l);
    addEvent(a, ')', l);
    addEvent(a, '(', r);
    addEvent(a + h, ']', r);
  }
  for (int k = 0; k < m; k++) {
    int b, z;
    cin >> b >> z;
    addEvent(b, 'o', z);
  }
  Priority[(int)'['] = 0;
  Priority[(int)')'] = 1;
  Priority[(int)'o'] = 2;
  Priority[(int)'('] = 3;
  Priority[(int)']'] = 4;
  sort((V).begin(), (V).end());
  double ans = 0.0;
  int cnt[50] = {0};
  int treecnt = 0;
  long double sum = 0.0;
  int killers = 0;
  for (int i = 0; i < (int)((V).size()); i++) {
    if (V[i].type == '[' || V[i].type == '(') {
      if (V[i].prob == 100) {
        killers++;
      } else {
        sum += log(0.01 * (100 - V[i].prob));
      }
    }
    if (V[i].type == ']' || V[i].type == ')') {
      if (V[i].prob == 100) {
        killers--;
      } else {
        sum -= log(0.01 * (100 - V[i].prob));
      }
    }
    if (V[i].type == 'o') {
      if (killers) {
        continue;
      }
      long double prob = exp(sum);
      ans += prob * V[i].z;
    }
  }
  printf("%.7lf\n", ans);
  return false;
}
int main() {
  int t = 0;
  while (Solve(++t))
    ;
  return 0;
}
