func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m;   double b[100005];   struct node {     double he, cheng;   } a[100005 * 4];   node merge(node a, node b) {     node c;     c.cheng = a.cheng * b.cheng;     c.he = a.he + a.cheng * (b.he - 1);     return c;   }   void build(int x, int l, int r) {     if (l == r) {       a[x].he = 1 + b[l];       a[x].cheng = b[l];       return;     }     int mid = (l + r) / 2;     build(x * 2, l, mid);     build(x * 2 + 1, mid + 1, r);     a[x] = merge(a[x * 2], a[x * 2 + 1]);   }   void modify(int x, int l, int r, int wh, double val) {     if (l == r) {       a[x].cheng = val;       a[x].he = 1 + val;       return;     }     int mid = (l + r) / 2;     if (mid >= wh)       modify(x * 2, l, mid, wh, val);     else       modify(x * 2 + 1, mid + 1, r, wh, val);     a[x] = merge(a[x * 2], a[x * 2 + 1]);   }   node query(int x, int l, int r, int tx, int ty) {     if (l >= tx && r <= ty) return a[x];     int mid = (l + r) / 2;     if (mid >= tx && mid < ty)       return merge(query(x * 2, l, mid, tx, ty),                    query(x * 2 + 1, mid + 1, r, tx, ty));     if (mid >= tx)       return query(x * 2, l, mid, tx, ty);     else       return query(x * 2 + 1, mid + 1, r, tx, ty);   }   int main() {     scanf( %d%d , &n, &m);     for (int i = 1; i <= n; i++) {       double x, y;       scanf( %lf%lf , &x, &y);       double t = x / y;       b[i] = (1 - t) / t;     }     build(1, 1, n);     while (m--) {       int type;       scanf( %d , &type);       if (type == 1) {         int wh;         scanf( %d , &wh);         double x, y;         scanf( %lf%lf , &x, &y);         double t = x / y;         t = (1 - t) / t;         modify(1, 1, n, wh, t);       } else {         int x, y;         scanf( %d%d , &x, &y);         printf( %.10lf n , 1.0 / query(1, 1, n, x, y).he);       }     }     return 0;   }   