#include <bits/stdc++.h>
using namespace std;
template <typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p) {
  out << '(' << p.first << ", " << p.second << ')';
  return out;
}
template <typename T>
ostream& operator<<(ostream& out, vector<T> const& v) {
  long long l = v.size();
  for (long long i = 0; i < l - 1; i++) out << v[i] << ' ';
  if (l > 0) out << v[l - 1];
  return out;
}
template <typename T>
ostream& operator<<(ostream& out, set<T> const& v) {
  for (auto i = v.begin(); i != v.end(); i++) out << (*i) << ' ';
  return out;
}
template <typename T, typename V>
ostream& operator<<(ostream& out, map<T, V> const& v) {
  for (auto i = v.begin(); i != v.end(); i++)
    out << "\n" << (i->first) << ":" << (i->second);
  return out;
}
template <typename T>
void trace(const char* name, T&& arg1) {
  cout << name << " : " << arg1 << "\n";
}
template <typename T, typename... Args>
void trace(const char* names, T&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cout.write(names, comma - names) << " : " << arg1 << " | ";
  trace(comma + 1, args...);
}
const int N = 1e5 + 199;
long double t[4 * N];
long double combine(long double a, long double b) { return a * b; }
void build(int v, int tl, int tr) {
  if (tl == tr) {
    t[v] = 1.0;
  } else {
    int tm = (tl + tr) / 2;
    build(v * 2, tl, tm);
    build(v * 2 + 1, tm + 1, tr);
    t[v] = combine(t[v * 2], t[v * 2 + 1]);
  }
}
void update(int v, int tl, int tr, int pos, long double new_val) {
  if (tl == tr) {
    t[v] = new_val;
  } else {
    int tm = (tl + tr) / 2;
    if (pos <= tm)
      update(v * 2, tl, tm, pos, new_val);
    else
      update(v * 2 + 1, tm + 1, tr, pos, new_val);
    t[v] = combine(t[v * 2], t[v * 2 + 1]);
  }
}
struct event {
  int a, h, l, r, s, ind;
};
int n, m;
map<int, vector<event>> sweepin, sweepout, sweepoutleft;
map<int, vector<pair<int, int>>> shrooms;
long double ans[N];
int solve() {
  cin >> n >> m;
  set<int> all;
  for (int i = 1; i <= n; i++) {
    int a, h, l, r;
    cin >> a >> h >> l >> r;
    int s = 100 - l - r;
    sweepin[a].push_back({a, h, l, r, s, i});
    sweepout[a + h].push_back({a, h, l, r, s, i});
    sweepoutleft[a - h].push_back({a, h, l, r, s, i});
    all.insert(a);
    all.insert(a + h);
    all.insert(a - h);
  }
  build(1, 1, n);
  for (int i = 1; i <= m; i++) {
    int b, z;
    cin >> b >> z;
    shrooms[b].push_back({z, i});
    ans[i] = z;
    all.insert(b);
  }
  for (auto i : all) {
    for (auto s : shrooms[i]) {
      ans[s.second] *= t[1];
    }
    for (auto j : sweepin[i]) {
      long double fallinleft = (j.l + j.s + 0.00) / 100.00;
      update(1, 1, n, j.ind, fallinleft);
    }
    for (auto j : sweepout[i]) {
      update(1, 1, n, j.ind, 1.0);
    }
  }
  build(1, 1, n);
  for (auto it = all.rbegin(); it != all.rend(); it++) {
    int i = *it;
    for (auto s : shrooms[i]) {
      ans[s.second] *= t[1];
    }
    for (auto j : sweepin[i]) {
      long double fallinright = (j.r + j.s + 0.00) / 100.00;
      update(1, 1, n, j.ind, fallinright);
    }
    for (auto j : sweepoutleft[i]) {
      update(1, 1, n, j.ind, 1.0);
    }
  }
  long double final_ans = 0.0;
  for (int i = 1; i <= m; i++) {
    final_ans += ans[i];
  }
  cout << fixed << setprecision(12) << final_ans << "\n";
  return 0;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int t;
  t = 1;
  while (t--) solve();
}
