#include <bits/stdc++.h>
int n, m, cnt;
struct data1 {
  int a, h, l, r;
};
struct data2 {
  int b, z;
};
struct data3 {
  int p, idx;
  bool sw;
  bool sten;
};
data1 namu[1000010];
data2 mush[1000010];
data3 gugan[1000010 * 5];
double answer;
void input(void) {
  int i;
  scanf("%d %d", &n, &m);
  for (i = 1; i <= n; i++) {
    scanf("%d %d %d %d", &namu[i].a, &namu[i].h, &namu[i].l, &namu[i].r);
  }
  for (i = 1; i <= m; i++) {
    scanf("%d %d", &mush[i].b, &mush[i].z);
  }
}
inline bool sortf2(const data2 &a, const data2 &b) {
  if (a.b < b.b) return true;
  return false;
}
int min(int a, int b) { return (a < b) ? b : a; }
int bs(int t, bool s) {
  int f = 1, l = m, mid;
  int i;
  for (;;) {
    mid = (f + l) / 2;
    if (mush[mid].b > t) {
      l = mid - 1;
    } else if (mush[mid].b <= t) {
      f = mid + 1;
    }
    if (f > l) break;
  }
  if (!s) {
    for (i = min(1, mid - 10); i <= mid + 10; i++) {
      if (i > m) break;
      if (mush[i].b >= t) return i;
    }
  } else {
    for (i = mid + 10; i >= min(1, mid - 10); i--) {
      if (i > m) continue;
      if (mush[i].b <= t) return i;
    }
  }
}
inline bool sortf1(const data3 &a, const data3 &b) {
  if (a.p < b.p) return true;
  if (a.p == b.p && a.sten < b.sten) return true;
  return false;
}
void process(void) {
  int i, j, l, r, k1, k2, P;
  double k;
  std::sort(mush + 1, mush + m + 1, sortf2);
  for (i = 1; i <= n; i++) {
    l = namu[i].a - namu[i].h;
    r = namu[i].a;
    k1 = bs(l, 0);
    k2 = bs(r - 1, 1);
    if (k1 <= k2 && l <= mush[k1].b && mush[k1].b <= r - 1 && l <= mush[k2].b &&
        mush[k2].b <= r - 1) {
      if (namu[i].l == 100) {
        for (j = k1; j <= k2; j++) {
          mush[j].z = 0;
        }
      } else {
        gugan[++cnt].p = k1, gugan[cnt].sw = 0, gugan[cnt].idx = i,
        gugan[cnt].sten = 0;
        gugan[++cnt].p = k2, gugan[cnt].sw = 0, gugan[cnt].idx = i,
        gugan[cnt].sten = 1;
      }
    }
    l = namu[i].a, r = namu[i].a + namu[i].h;
    k1 = bs(l + 1, 0);
    k2 = bs(r, 1);
    if (k1 <= k2 && l + 1 <= mush[k1].b && mush[k1].b <= r &&
        l + 1 <= mush[k2].b && mush[k2].b <= r) {
      if (namu[i].r == 100) {
        for (j = k1; j <= k2; j++) {
          mush[j].z = 0;
        }
      } else {
        gugan[++cnt].p = k1, gugan[cnt].sw = 1, gugan[cnt].idx = i,
        gugan[cnt].sten = 0;
        gugan[++cnt].p = k2, gugan[cnt].sw = 1, gugan[cnt].idx = i,
        gugan[cnt].sten = 1;
      }
    }
  }
  std::sort(gugan + 1, gugan + cnt + 1, sortf1);
  k = 1.0;
  P = 1;
  for (i = 1; i <= m; i++) {
    if (gugan[P].p == i && gugan[P].sten == 0) {
      if (gugan[P].sw == 0)
        k *= 1 - (double)(namu[gugan[P].idx].l) / 100;
      else
        k *= 1 - (double)(namu[gugan[P].idx].r) / 100;
      P++;
      i--;
      continue;
    }
    answer += k * (double)mush[i].z;
    for (;;) {
      if (gugan[P].p > i) break;
      if (gugan[P].p == i && gugan[P].sten == 1) {
        if (gugan[P].sw == 0 && gugan[P].idx)
          k /= 1 - (double)(namu[gugan[P].idx].l) / 100;
        else
          k /= 1 - (double)(namu[gugan[P].idx].r) / 100;
      }
      P++;
    }
    if (P > cnt) break;
  }
  i++;
  for (; i <= m; i++) {
    answer += (double)mush[i].z;
  }
  printf("%lf\n", answer);
}
int main(void) {
  input();
  process();
  return false;
}
