func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 100500;   struct matrix {     long double a[3][3];     void clear() { memset(a, 0, sizeof(a)); }     matrix operator*(const matrix &y) {       matrix ans;       ans.clear();       for (int i = (0), iend = (2); i <= iend; i++)         for (int j = (0), jend = (2); j <= jend; j++)           for (int k = (0), kend = (2); k <= kend; k++)             ans.a[i][j] += a[i][k] * y.a[k][j];       return ans;     }   } basis;   struct segment_tree {     matrix sum[maxn << 2];     void push_up(int rt) { sum[rt] = sum[(rt << 1)] * sum[(rt << 1 | 1)]; }     void upd(int l, int r, int rt, int tar, long double val) {       if (l == r) {         sum[rt].clear();         sum[rt].a[1][0] = 1;         sum[rt].a[2][1] = 1;         sum[rt].a[1][2] = (val - 1) / val;         sum[rt].a[2][2] = 1 / val;         return;       }       int mid = (l + r) >> 1;       if (tar <= mid)         upd(l, mid, (rt << 1), tar, val);       else         upd(mid + 1, r, (rt << 1 | 1), tar, val);       push_up(rt);     }     matrix query(int l, int r, int rt, int tl, int tr) {       if (tl <= l && r <= tr) return sum[rt];       int mid = (l + r) >> 1;       matrix ans = basis;       if (tl <= mid) ans = ans * query(l, mid, (rt << 1), tl, tr);       if (tr >= mid + 1) ans = ans * query(mid + 1, r, (rt << 1 | 1), tl, tr);       return ans;     }   } t;   int main() {     basis.clear();     for (int i = (0), iend = (2); i <= iend; i++) basis.a[i][i] = 1;     int n, q;     scanf( %d%d , &n, &q);     for (int i = (1), iend = (n); i <= iend; i++) {       int a, b;       scanf( %d%d , &a, &b);       t.upd(1, n, 1, i, (long double)(a) / b);     }     for (int i = (1), iend = (q); i <= iend; i++) {       int ty;       scanf( %d , &ty);       if (ty == 1) {         int idx, a, b;         scanf( %d%d%d , &idx, &a, &b);         t.upd(1, n, 1, idx, (long double)(a) / b);       } else {         int l, r;         scanf( %d%d , &l, &r);         matrix ans;         ans.clear();         ans.a[0][2] = 1;         ans = ans * t.query(1, n, 1, l, r);         long double out = (long double)(1) / ans.a[0][2];         if (isnan(out)) out = 0;         printf( %.7lf n , (double)(out));       }     }   }   