func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 2e6 + 1, INF = 1e9 + 1;   int n, q, a, b, p, t;   pair<long double, long double> st[N], lf, rg;   pair<long double, long double> merge(pair<long double, long double> a,                                        pair<long double, long double> b) {     long double l1 = a.first, r1 = a.second, l2 = b.first, r2 = b.second;     if (a.first < 0 and a.second < 0) return b;     if (b.first < 0 and b.second < 0) return a;     return pair<long double, long double>(         l1 * l2 / (1 - r1 * (1 - l2)),         r2 + r1 * l2 * (1 - r2) / (1 - (r1 * (1 - l2))));   }   pair<long double, long double> query(int l, int r) {     lf = rg = pair<long double, long double>(-1, -1);     l += n - 1, r += n;     while (l < r) {       if (l & 1) lf = merge(lf, st[l++]);       if (r & 1) rg = merge(st[--r], rg);       l /= 2, r /= 2;     }     return merge(lf, rg);   }   void update(int k, long double v) {     k += n - 1;     st[k] = pair<long double, long double>(v, v);     while (k) k /= 2, st[k] = merge(st[2 * k], st[2 * k + 1]);   }   int main() {     scanf( %d%d , &n, &q);     for (int i = n; i < 2 * n; ++i) {       scanf( %d%d , &a, &b);       st[i] = pair<long double, long double>(1.0 * a / b, 1.0 * a / b);     }     for (int i = n - 1; i >= 0; --i) st[i] = merge(st[2 * i], st[2 * i + 1]);     for (int i = 0; i < q; ++i) {       scanf( %d , &t);       if (t == 1) {         scanf( %d%d%d , &p, &a, &b);         update(p, 1.0L * a / b);       } else {         scanf( %d%d , &a, &b);         printf( %lf n , (double)query(a, b).first);       }     }     return 0;   }   