#include <bits/stdc++.h>
struct sgt {
  struct node {
    int l, r;
    double addtag, multag, s;
  };
  node a[5000005];
  double f[100005];
  int n;

 private:
  void pushup(int k) { a[k].s = a[k * 2].s + a[k * 2 + 1].s; }
  void tagclear(int k) {
    a[k].addtag = 0;
    a[k].multag = 1;
  }
  void putadd(int k, double v) {
    a[k].addtag = a[k].addtag + v;
    a[k].s = a[k].s + v * (a[k].r - a[k].l + 1);
  }
  void putmul(int k, double v) {
    a[k].multag = a[k].multag * v;
    a[k].addtag = a[k].addtag * v;
    a[k].s = a[k].s * v;
  }
  void pushdown(int k) {
    putmul(k * 2, a[k].multag), putadd(k * 2, a[k].addtag);
    putmul(k * 2 + 1, a[k].multag), putadd(k * 2 + 1, a[k].addtag);
    tagclear(k);
  }
  void build(int k, int l, int r) {
    tagclear(k);
    a[k].l = l, a[k].r = r;
    if (l == r) return a[k].s = f[l], void();
    int mid = (l + r) / 2;
    build(k * 2, l, mid);
    build(k * 2 + 1, mid + 1, r);
    pushup(k);
  }
  void updadd(int k, int x, int y, double v) {
    if (x <= a[k].l && a[k].r <= y) return putadd(k, v), void();
    int mid = (a[k].l + a[k].r) / 2;
    pushdown(k);
    if (x <= mid) updadd(k * 2, x, y, v);
    if (mid < y) updadd(k * 2 + 1, x, y, v);
    pushup(k);
  }
  void updmul(int k, int x, int y, double v) {
    if (x <= a[k].l && a[k].r <= y) return putmul(k, v), void();
    int mid = (a[k].l + a[k].r) / 2;
    pushdown(k);
    if (x <= mid) updmul(k * 2, x, y, v);
    if (mid < y) updmul(k * 2 + 1, x, y, v);
    pushup(k);
  }
  double query(int k, int x, int y) {
    if (x <= a[k].l && a[k].r <= y) return a[k].s;
    int mid = (a[k].l + a[k].r) / 2;
    double ans = 0;
    pushdown(k);
    if (x <= mid) ans = ans + query(k * 2, x, y);
    if (mid < y) ans = ans + query(k * 2 + 1, x, y);
    return ans;
  }

 public:
  void make(int nn) {
    n = nn;
    build(1, 1, n);
  }
  void add(int l, int r, double k) { updadd(1, l, r, k); }
  void mul(int l, int r, double k) { updmul(1, l, r, k); }
  double ask(int l, int r) { return query(1, l, r); }
};
sgt t;
int n, q;
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) scanf("%lf", &t.f[i]);
  t.make(n);
  while (q--) {
    int opt;
    scanf("%d", &opt);
    if (opt == 1) {
      int l1, r1, l2, r2, len1, len2;
      scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
      len1 = r1 - l1 + 1, len2 = r2 - l2 + 1;
      double x1 = t.ask(l1, r1), x2 = t.ask(l2, r2);
      t.mul(l1, r1, (len1 - 1) / (double)len1), t.add(l1, r1, x2 / len2 / len1);
      t.mul(l2, r2, (len2 - 1) / (double)len2), t.add(l2, r2, x1 / len1 / len2);
    } else if (opt == 2) {
      int l, r;
      scanf("%d%d", &l, &r);
      printf("%lf\n", t.ask(l, r));
    }
  }
  return 0;
}
