#include <bits/stdc++.h>
using namespace std;
inline void read(int& x) {
  char c11 = getchar();
  x = 0;
  while (!isdigit(c11)) c11 = getchar();
  while (isdigit(c11)) x = x * 10 + c11 - '0', c11 = getchar();
}
inline void cmax(int& A, const int& B) {
  if (A < B) A = B;
}
const int S = 101003, N = 5011;
struct Edge {
  int v, nxt;
} a[N];
int s[S], head[N], fa[N];
double f[N][N];
int n, Q, _;
inline void add(int u, int v) { a[++_] = (Edge){v, head[u]}, head[u] = _; }
namespace SEG {
int seg[S << 2];
void build(int l, int r, int x) {
  if (l == r) {
    seg[x] = s[l];
    return;
  }
  int mid(l + r >> 1);
  build(l, mid, x << 1);
  build(mid + 1, r, x << 1 | 1);
  seg[x] = max(seg[x << 1], seg[x << 1 | 1]);
}
int query(int l, int r, int x, int L, int R) {
  if (L <= l and r <= R) return seg[x];
  int mid(l + r >> 1), res = 0;
  if (L <= mid) cmax(res, query(l, mid, x << 1, L, R));
  if (mid < R) cmax(res, query(mid + 1, r, x << 1 | 1, L, R));
  return res;
}
void Build() { build(1, n, 1); }
int Get(int l, int r) { return query(1, n, 1, l, r); }
}  // namespace SEG
struct Qry {
  int l, r;
  double p;
  int mx;
  inline void set(int L, int R, double P) {
    mx = SEG::Get(l = L, r = R), p = P;
  }
  friend inline bool operator<(const Qry& A, const Qry& B) {
    return A.l != B.l ? A.l < B.l : A.r > B.r;
  }
} q[N];
int build(int x) {
  if (x) add(fa[x], x);
  for (int i = x + 1, j; i <= Q; i = j) {
    if (q[i].r > q[x].r) return i;
    fa[i] = x, j = build(i);
  }
  return Q + 1;
}
void dfs(int x) {
  if (!head[x]) {
    f[x][0] = 1 - q[x].p;
    for (int i = 1; i <= Q; ++i) f[x][i] = 1.0;
    return;
  }
  for (int i = head[x]; i; i = a[i].nxt) dfs(a[i].v);
  for (int j = 0; j <= Q; ++j) {
    double t1 = 1.0, t2 = 1.0;
    for (int i = head[x]; i; i = a[i].nxt) {
      t1 *= f[a[i].v][min(Q, j + q[x].mx - q[a[i].v].mx - 1)];
      t2 *= f[a[i].v][min(Q, j + q[x].mx - q[a[i].v].mx)];
    }
    f[x][j] = (1 - q[x].p) * t2;
    if (j) f[x][j] += q[x].p * t1;
  }
}
int main() {
  read(n), read(Q);
  int U = 0;
  for (int i = 1; i <= n; ++i) read(s[i]), cmax(U, s[i]);
  if (U > Q)
    for (int i = 1; i <= n; ++i) s[i] = max(0, s[i] - U + Q);
  SEG::Build();
  for (int i = 1, l, r; i <= Q; ++i) {
    double p;
    read(l), read(r);
    scanf("%lf", &p);
    q[i].set(l, r, p);
  }
  sort(q + 1, q + Q + 1);
  q[fa[1] = 0].set(1, n, 0);
  build(0);
  dfs(0);
  double Ans = U;
  for (int i = 1; i <= Q; ++i) Ans += i * (f[0][i] - f[0][i - 1]);
  printf("%.8lf\n", Ans);
  return 0;
}
