func_code_string: #include <bits/stdc++.h>   using namespace std;   const int INF = 0x3f3f3f3f;   const long long INFL = 0x3f3f3f3f3f3f3f3fLL;   const long double eps = 1e-8;   const int MAXN = 100000 + 5;   pair<long double, long double> X[MAXN << 2];   inline pair<long double, long double> calc(const int& a, const int& b) {     long double x = (long double)(b - a) / (long double)a;     return make_pair(x, x);   }   inline void pushUp(const int& rt) {     X[rt].first = X[rt << 1].first * X[rt << 1 | 1].first;     X[rt].second = X[rt << 1].second + X[rt << 1 | 1].second * X[rt << 1].first;   }   void build(int l, int r, int rt) {     static int ax, bx;     if (l == r) {       scanf( %d %d , &ax, &bx);       X[rt] = calc(ax, bx);       return;     }     int mid = (l + r) >> 1;     build(l, mid, rt << 1);     build(mid + 1, r, rt << 1 | 1);     pushUp(rt);   }   void update(const int& p, const pair<long double, long double>& v, int l, int r,               int rt) {     if (l == r) {       X[rt] = v;       return;     }     int mid = (l + r) >> 1;     if (p <= mid)       update(p, v, l, mid, rt << 1);     else       update(p, v, mid + 1, r, rt << 1 | 1);     pushUp(rt);   }   pair<long double, long double> query(const int& L, const int& R, int l, int r,                                        int rt) {     static pair<long double, long double> z =         make_pair((long double)1.0, (long double)0.0);     if (L <= l && r <= R) return X[rt];     int mid = (l + r) >> 1;     pair<long double, long double> x = z, y = z, ret;     if (L <= mid) x = query(L, R, l, mid, rt << 1);     if (R > mid) y = query(L, R, mid + 1, r, rt << 1 | 1);     ret.first = x.first * y.first;     ret.second = x.second + y.second * x.first;     return ret;   }   int main() {     static int n, q, op, x, ax, bx, lx, rx;     while (~scanf( %d %d , &n, &q)) {       build(1, n, 1);       while (q--) {         scanf( %d , &op);         if (op == 1) {           scanf( %d %d %d , &x, &ax, &bx);           update(x, calc(ax, bx), 1, n, 1);         } else {           scanf( %d %d , &lx, &rx);           long double ans = query(lx, rx, 1, n, 1).second;           if (ans != ans || ans >= 1e20)             ans = 0.0;           else             ans = 1 / (1 + ans);           cout << fixed << setprecision(8) << ans <<   n ;         }       }     }     return 0;   }   