#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using db = double;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 5;
int n, m, opt, l[2], r[2];
int a[maxn];
int len[maxn << 4];
struct tree {
  db s, mul, add;
} T[maxn << 4];
void pup(int id) { T[id].s = T[id << 1].s + T[id << 1 | 1].s; }
void pdd(int id) {
  T[id << 1].s = T[id << 1].s * T[id].mul + T[id].add * len[id << 1];
  T[id << 1 | 1].s =
      T[id << 1 | 1].s * T[id].mul + T[id].add * len[id << 1 | 1];
  T[id << 1].add = T[id << 1].add * T[id].mul + T[id].add;
  T[id << 1 | 1].add = T[id << 1 | 1].add * T[id].mul + T[id].add;
  T[id << 1].mul = T[id << 1].mul * T[id].mul;
  T[id << 1 | 1].mul = T[id << 1 | 1].mul * T[id].mul;
  T[id].add = 0;
  T[id].mul = 1;
}
void build(int l, int r, int id) {
  T[id].mul = 1;
  T[id].add = 0;
  len[id] = r - l + 1;
  if (l == r) {
    T[id].s = a[l];
    return;
  }
  int mid = (l + r) / 2;
  build(l, mid, id << 1);
  build(mid + 1, r, id << 1 | 1);
  pup(id);
}
void update(int L, int R, db d, db rat, int l, int r, int id) {
  if (L <= l && r <= R) {
    T[id].s = T[id].s * rat + d * len[id];
    T[id].add = T[id].add * rat + d;
    T[id].mul = T[id].mul * rat;
    return;
  }
  pdd(id);
  int mid = (l + r) / 2;
  if (mid >= L) update(L, R, d, rat, l, mid, id << 1);
  if (mid < R) update(L, R, d, rat, mid + 1, r, id << 1 | 1);
  pup(id);
}
db query(int L, int R, int l, int r, int id) {
  if (L <= l && r <= R) {
    return T[id].s;
  }
  pdd(id);
  int mid = (l + r) / 2;
  if (mid >= R)
    return query(L, R, l, mid, id << 1);
  else if (mid < L)
    return query(L, R, mid + 1, r, id << 1 | 1);
  else
    return query(L, R, l, mid, id << 1) + query(L, R, mid + 1, r, id << 1 | 1);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  build(1, n, 1);
  while (m--) {
    scanf("%d", &opt);
    if (opt == 1) {
      scanf("%d%d%d%d", &l[0], &r[0], &l[1], &r[1]);
      db left = query(l[0], r[0], 1, n, 1);
      db right = query(l[1], r[1], 1, n, 1);
      update(l[0], r[0], right / (r[1] - l[1] + 1) / (r[0] - l[0] + 1),
             1.0 * (r[0] - l[0]) / (r[0] - l[0] + 1), 1, n, 1);
      update(l[1], r[1], left / (r[0] - l[0] + 1) / (r[1] - l[1] + 1),
             1.0 * (r[1] - l[1]) / (r[1] - l[1] + 1), 1, n, 1);
    } else {
      scanf("%d%d", &l[0], &r[0]);
      db res = query(l[0], r[0], 1, n, 1);
      printf("%.12lf\n", res);
    }
  }
  return 0;
}
