#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;
}
