#include <bits/stdc++.h>   #pragma comment(linker,  /STACK:268435456 )   using namespace std;   const string IN_NAME =  input.txt ;   const string OUT_NAME =  output.txt ;   template <class T>   T abs(T &x) {     return ((x) >= 0) ? (x) : (-(x));   }   template <class T>   T sqr(T &x) {     return (x) * (x);   }   template <class T>   T min(T &a, T &b) {     return ((a) < (b)) ? (a) : (b);   }   template <class T>   T max(T &a, T &b) {     return ((a) > (b)) ? (a) : (b);   }   int n, m;   struct tree {     int x, h, pL, pR;     tree() {}     bool operator<(const tree &t) const { return x < t.x; }   };   struct mush {     int x, z;     mush() {}     bool operator<(const mush &t) const { return x < t.x; }   };   tree a[100010];   mush b[100010], tmpb[100010];   int binSearch(int x) {     if (x < b[0].x) return -1;     if (x > b[m - 1].x) return -m - 1;     int left = 0, right = m - 1;     while (right - left > 1) {       int mid = (left + right) >> 1;       if (b[mid].x == x) return mid;       if (b[mid].x < x)         left = mid + 1;       else         right = mid - 1;     }     for (int i = max(0, left - 4); i < min(m - 1, right + 3); i++) {       if (b[i].x < x && x < b[i + 1].x) return -(i + 1) - 1;     }     return right;   }   double d[100010];   double db[100010];   int dk;   void multQuery(int left, int right, double p) {     if (left > right) return;     int L = left / dk + 1;     int R = right / dk - 1;     if (L > R) {       for (int i = left; i <= right; i++) d[i] *= p;     } else {       for (int i = left; i < L * dk; i++) d[i] *= p;       for (int j = L; j <= R; j++) db[j] *= p;       for (int i = (R + 1) * dk; i <= right; i++) d[i] *= p;     }   }   double getQuery(int index) { return d[index] * db[index / dk]; }   int main() {     scanf( %d%d , &n, &m);     for (int i = 0; i < n; i++)       scanf( %d%d%d%d , &a[i].x, &a[i].h, &a[i].pL, &a[i].pR);     for (int i = 0; i < m; i++) scanf( %d%d , &tmpb[i].x, &tmpb[i].z);     sort(a, a + n);     sort(tmpb, tmpb + m);     int newM = 0;     for (int i = 0; i < m; i++) {       if (i == 0 || tmpb[i - 1].x < tmpb[i].x) {         b[newM].x = tmpb[i].x;         b[newM].z = tmpb[i].z;         newM++;       } else {         b[newM - 1].z += tmpb[i].z;       }     }     m = newM;     for (int i = 0; i < n; i++) a[i].x *= 2;     for (int i = 0; i < n; i++) a[i].h *= 2;     for (int i = 0; i < m; i++) b[i].x *= 2;     dk = (int)sqrt(m + 1e-9);     for (int i = 0; i < m + 5; i++) {       d[i] = db[i] = 1;     }     for (int i = 0; i < n; i++) {       int leftIndex = binSearch(a[i].x - a[i].h - 1);       int rightIndex = binSearch(a[i].x + a[i].h + 1);       int thisLeftIndex = binSearch(a[i].x - 1);       int thisRightIndex = binSearch(a[i].x + 1);       leftIndex = ~leftIndex;       rightIndex = ~rightIndex;       thisLeftIndex = ~thisLeftIndex;       thisRightIndex = ~thisRightIndex;       multQuery(leftIndex, thisLeftIndex - 1, 1.0 - a[i].pL / 100.0);       multQuery(thisRightIndex, rightIndex - 1, 1.0 - a[i].pR / 100.0);     }     double result = 0;     for (int i = 0; i < m; i++) {       result += getQuery(i) * b[i].z;     }     printf( %.12f , result);   }   