#include <bits/stdc++.h>
using namespace std;
int N, M;
pair<int, double> mush[int(1 << 14)];
int pos[100010];
int ord[int(1 << 14)];
int h[100010];
double pL[100010];
double pR[100010];
double temp[int(1 << 14)];
double Tree[2 * int(1 << 14)];
int after(int x) {
  if (mush[M - 1].first <= x) return -1;
  int i = 0;
  int j = M - 1;
  while (i < j) {
    int media = (i + j) / 2;
    if (x < mush[media].second) {
      j = media;
    } else {
      i = media + 1;
    }
  }
  return i;
}
void aggiorna(int v, int a, int b, int i, int j, double value) {
  if (i <= mush[a].first and mush[b].first <= j) {
    Tree[v] *= double(1) - value;
    return;
  }
  if (mush[b].first < i or j < mush[a].first) return;
  int media = (a + b) / 2;
  aggiorna(2 * v, a, media, i, j, value);
  aggiorna(2 * v + 1, media + 1, b, i, j, value);
}
int main() {
  cin >> N >> M;
  for (int i = 0; i < N; i++) {
    cin >> pos[i];
    cin >> h[i];
    cin >> pL[i];
    cin >> pR[i];
    pL[i] /= double(100);
    pR[i] /= double(100);
  }
  for (int i = 0; i < M; i++) {
    cin >> mush[i].first >> mush[i].second;
  }
  sort(mush, mush + M);
  for (int i = 0; i < M; i++) temp[i] = 1;
  for (int i = M; i < int(1 << 14); i++) {
    mush[i].first = 1000000100;
    mush[i].second = 0;
  }
  for (int i = 1; i < 2 * int(1 << 14); i++) Tree[i] = 1;
  for (int i = 0; i < N; i++) {
    aggiorna(1, 0, int(1 << 14) - 1, pos[i] - h[i], pos[i] - 1, pL[i]);
    aggiorna(1, 0, int(1 << 14) - 1, pos[i] + 1, pos[i] + h[i], pR[i]);
  }
  double res = 0;
  for (int i = 0; i < M; i++) {
    double yo = 1;
    int act = int(1 << 14) + i;
    while (act != 0) {
      yo *= Tree[act];
      act /= 2;
    }
    res += yo * mush[i].second;
  }
  cout.precision(10);
  cout << res;
}
