#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T& x) {
  x = 0;
  T fl = 1;
  char ch = 0;
  for (; ch < '0' || ch > '9'; ch = getchar())
    if (ch == '-') fl = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar())
    x = (x << 1) + (x << 3) + (ch ^ 48);
  x *= fl;
}
template <typename T, typename... Args>
inline void read(T& x, Args&... args) {
  read(x);
  read(args...);
}
const int N = 100000 + 6;
struct seg {
  struct node {
    double su, mu;
  } tr[N << 2];
  void pushup(int nod) {
    tr[nod].mu = tr[(nod << 1)].mu * tr[(nod << 1 | 1)].mu;
    tr[nod].su = tr[(nod << 1)].su + tr[(nod << 1)].mu * tr[(nod << 1 | 1)].su;
  }
  void ins(int nod, int l, int r, int k, double val) {
    if (l == r) {
      tr[nod].mu = tr[nod].su = val;
      return;
    }
    int mid = (l + r) >> 1;
    if (k <= mid)
      ins((nod << 1), l, mid, k, val);
    else
      ins((nod << 1 | 1), mid + 1, r, k, val);
    pushup(nod);
  }
  double query1(int nod, int l, int r, int ql, int qr) {
    if (ql <= l && r <= qr) return tr[nod].mu;
    int mid = (l + r) >> 1;
    double res = 1.0;
    if (ql <= mid) res = res * query1((nod << 1), l, mid, ql, qr);
    if (qr > mid) res = res * query1((nod << 1 | 1), mid + 1, r, ql, qr);
    return res;
  }
  double query(int nod, int l, int r, int ql, int qr) {
    if (ql <= l && r <= qr) return tr[nod].su;
    int mid = (l + r) >> 1;
    double res = 0.0;
    if (ql <= mid) res += query((nod << 1), l, mid, ql, qr);
    if (qr > mid)
      res += query((nod << 1 | 1), mid + 1, r, ql, qr) *
             query1((nod << 1), l, mid, ql, mid);
    return res;
  }
} sgt;
double p[N], t[N];
int n, m;
int main() {
  read(n, m);
  for (int i = (1); i <= (n); i++) {
    int a, b;
    read(a, b);
    p[i] = (1.0 * a) / (1.0 * b);
    t[i] = (1.0 - p[i]) / p[i];
    sgt.ins(1, 1, n, i, t[i]);
  }
  for (int _ = (1); _ <= (m); _++) {
    int opt, x, y, z;
    read(opt);
    if (opt == 1) {
      read(x, y, z);
      p[x] = (1.0 * y) / (1.0 * z);
      t[x] = (1.0 - p[x]) / p[x];
      sgt.ins(1, 1, n, x, t[x]);
    } else {
      read(x, y);
      double res = sgt.query(1, 1, n, x, y);
      printf("%.10f\n", 1.0 / (1.0 + res));
    }
  }
  return 0;
}
