#include <bits/stdc++.h>   using namespace std;   const double eps = 1e-7;   const int inf = 0x3f3f3f3f;   const int hinf = 0x3f3f3f3f;   const long long mod = 1000000009;   struct node {     int l, r;     double expe;     double add;   } sgt[100010 << 2];   int n, m;   int a[100010], h[100010], l[100010], r[100010];   struct mushroom {     int b, z;     bool operator<(const mushroom& bb) const { return b < bb.b; }   } dat[100010];   void up(int root) {     sgt[root].expe = sgt[root << 1].expe + sgt[root << 1 | 1].expe;   }   void down(int root) {     sgt[root << 1].add *= sgt[root].add;     sgt[root << 1].expe *= sgt[root].add;     sgt[root << 1 | 1].add *= sgt[root].add;     sgt[root << 1 | 1].expe *= sgt[root].add;     sgt[root].add = 1.0;   }   void build(int l, int r, int root) {     sgt[root].l = l;     sgt[root].r = r;     sgt[root].expe = 0.0;     sgt[root].add = 1.0;     if (l == r) {       sgt[root].expe = dat[sgt[root].l].z;       return;     }     int mid = (l + r) >> 1;     build(l, mid, root << 1);     build(mid + 1, r, root << 1 | 1);     up(root);   }   void upd(int l, int r, double val, int root) {     if (l > dat[sgt[root].r].b || r < dat[sgt[root].l].b) return;     if (dat[sgt[root].l].b >= l && dat[sgt[root].r].b <= r) {       sgt[root].add *= val;       sgt[root].expe *= val;       return;     }     down(root);     int mid = (sgt[root].l + sgt[root].r) >> 1;     if (l <= dat[mid].b) upd(l, r, val, root << 1);     if (r >= dat[mid].b) upd(l, r, val, root << 1 | 1);     up(root);   }   int main() {     scanf( %d%d , &n, &m);     for (int i = 1; i <= n; i++) {       scanf( %d%d%d%d , &a[i], &h[i], &l[i], &r[i]);     }     for (int i = 1; i <= m; i++) {       scanf( %d%d , &dat[i].b, &dat[i].z);     }     sort(dat + 1, dat + 1 + m);     build(1, m, 1);     for (int i = 1; i <= n; i++) {       upd(a[i] - h[i], a[i] - 1, 1.0 - l[i] / 100.0, 1);       upd(a[i] + 1, a[i] + h[i], 1.0 - r[i] / 100.0, 1);     }     printf( %.15lf n , sgt[1].expe);   }   