#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void ckmax(T& x, T y) {
  x = (y > x ? y : x);
}
template <typename T>
inline void ckmin(T& x, T y) {
  x = (y < x ? y : x);
}
const int MAXN = 1e5, MAXQ = 5001;
const int LOG = 16;
int n, q, a[MAXN + 5];
struct RangeMaxQuery {
  int _log2[MAXN + 5];
  pair<int, int> st[MAXN + 5][LOG + 1];
  void build(int* a, int n) {
    _log2[0] = -1;
    for (int i = 1; i <= n; ++i) {
      _log2[i] = _log2[i >> 1] + 1;
      st[i][0] = make_pair(a[i], i);
    }
    for (int j = 1; j <= LOG; ++j) {
      for (int i = 1; i + (1 << (j - 1)) <= n; ++i) {
        st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
      }
    }
  }
  pair<int, int> rmq(int l, int r) {
    int k = _log2[r - l + 1];
    return max(st[l][k], st[r - (1 << k) + 1][k]);
  }
  int rmq_val(int l, int r) { return rmq(l, r).first; }
  int rmq_pos(int l, int r) { return rmq(l, r).second; }
  RangeMaxQuery() {}
} RMQ;
struct Seg {
  int l, r, mx;
  double p;
} s[MAXQ + 5];
bool cmp(Seg x, Seg y) {
  if (x.l == y.l) return x.r > y.r;
  return x.l < y.l;
}
int sta[MAXQ + 5], top;
struct EDGE {
  int nxt, to;
} edge[MAXQ * 2 + 5];
int head[MAXQ + 5], tot;
inline void add_edge(int u, int v) {
  edge[++tot].nxt = head[u];
  edge[tot].to = v;
  head[u] = tot;
}
double dp[MAXQ + 5][MAXQ + 5];
void dfs(int u) {
  for (int i = head[u]; i; i = edge[i].nxt) {
    int v = edge[i].to;
    dfs(v);
  }
  for (int j = 0; j <= q; ++j) {
    double p = 1.0 - s[u].p;
    for (int i = head[u]; i; i = edge[i].nxt) {
      int v = edge[i].to;
      p *= dp[v][min(q, j + s[u].mx - s[v].mx)];
    }
    dp[u][j] += p;
  }
  for (int j = 1; j <= q; ++j) {
    double p = s[u].p;
    for (int i = head[u]; i; i = edge[i].nxt) {
      int v = edge[i].to;
      p *= dp[v][min(q, j + s[u].mx - s[v].mx - 1)];
    }
    dp[u][j] += p;
  }
}
int main() {
  ios ::sync_with_stdio(false);
  cin >> n >> q;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  RMQ.build(a, n);
  for (int i = 1; i <= q; ++i) {
    cin >> s[i].l >> s[i].r >> s[i].p;
    s[i].mx = RMQ.rmq_val(s[i].l, s[i].r);
  }
  ++q;
  s[q].l = 1;
  s[q].r = n;
  s[q].p = 0;
  s[q].mx = RMQ.rmq_val(1, n);
  sort(s + 1, s + q + 1, cmp);
  sta[++top] = 1;
  for (int i = 2; i <= q; ++i) {
    while (s[sta[top]].r < s[i].l) --top;
    assert(top >= 1);
    assert(s[sta[top]].r >= s[i].r);
    add_edge(sta[top], i);
    sta[++top] = i;
  }
  dfs(1);
  double ans = 0;
  for (int i = 0; i <= q; ++i) {
    double v = s[1].mx + i;
    double p = dp[1][i];
    if (i) p -= dp[1][i - 1];
    ans += v * p;
  }
  cout << setiosflags(ios ::fixed) << setprecision(8) << ans << endl;
  return 0;
}
