#include <bits/stdc++.h>
using namespace std;
int n, m, a[100005], f[100005], v[100005 + 100005], o[100005 + 100005], p,
    base[5005], lim[5005];
double dp[5005][5005], nd[5005], ans;
set<pair<int, int> > s;
struct query {
  int l, r;
  double p;
  bool operator<(const query &T) const { return l != T.l ? l < T.l : r > T.r; }
} q[5005];
void bd(int a, int b) {
  v[++p] = b;
  o[p] = f[a];
  f[a] = p;
}
void dfs(int x) {
  int r = q[x].r;
  base[x] = -1;
  lim[x] = 0;
  dp[x][0] = 1;
  for (int i = (f[x]); i; i = o[i]) {
    for (int j = (q[v[i]].r + 1); j <= (r); j++) {
      if (a[j] < base[x]) continue;
      if (a[j] > base[x] + lim[x]) {
        base[x] = a[j];
        lim[x] = 0;
        dp[x][0] = 1;
        continue;
      }
      int dis = a[j] - base[x];
      base[x] = a[j];
      lim[x] -= dis;
      for (int k = (0); k <= (lim[x]); k++) dp[x][k] = dp[x][k + dis];
      dp[x][0] = 1;
      for (int k = (1); k <= (lim[x]); k++) dp[x][0] -= dp[x][k];
    }
    dfs(v[i]);
    int rb = max(base[x], base[v[i]]);
    int rl = max(base[x] + lim[x] - rb, base[v[i]] + lim[v[i]] - rb);
    for (int j = (0); j <= (rl); j++) nd[j] = 0;
    for (int j = (0); j <= (lim[v[i]]); j++)
      for (int k = (0); k <= (lim[x]); k++) {
        int ind = max(base[v[i]] + j, base[x] + k) - rb;
        nd[ind] += dp[v[i]][j] * dp[x][k];
      }
    lim[x] = rl;
    base[x] = rb;
    for (int j = (0); j <= (rl); j++) dp[x][j] = nd[j];
    r = q[v[i]].l - 1;
  }
  for (int j = (q[x].l); j <= (r); j++) {
    if (a[j] < base[x]) continue;
    if (a[j] > base[x] + lim[x]) {
      base[x] = a[j];
      lim[x] = 0;
      dp[x][0] = 1;
      continue;
    }
    int dis = a[j] - base[x];
    base[x] = a[j];
    lim[x] -= dis;
    for (int k = (0); k <= (lim[x]); k++) dp[x][k] = dp[x][k + dis];
    dp[x][0] = 1;
    for (int k = (1); k <= (lim[x]); k++) dp[x][0] -= dp[x][k];
  }
  lim[x]++;
  for (int i = (0); i <= (lim[x]); i++) nd[i] = 0;
  for (int i = (0); i < (lim[x]); i++)
    nd[i] += dp[x][i] * (1 - q[x].p), nd[i + 1] += dp[x][i] * q[x].p;
  for (int i = (0); i <= (lim[x]); i++) dp[x][i] = nd[i];
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = (1); i <= (n); i++) scanf("%d", &a[i]);
  for (int i = (0); i < (m); i++) scanf("%d %d %lf", &q[i].l, &q[i].r, &q[i].p);
  q[m].l = 0;
  q[m].r = n;
  q[m].p = 0;
  sort(q, q + m + 1);
  s.insert(make_pair(q[0].r, 0));
  for (int i = (1); i <= (m); i++) {
    int par = s.lower_bound(make_pair(q[i].r, -(1 << 29)))->second;
    bd(-par, i);
    while (i < m && q[i + 1].l == q[i].l && q[i + 1].r == q[i].r) {
      bd(i, i + 1);
      i++;
    }
    s.insert(make_pair(q[i].r, -i));
  }
  dfs(0);
  for (int i = (0); i <= (lim[0]); i++) ans += dp[0][i] * (base[0] + i);
  printf("%.6lf\n", ans);
  scanf("\n");
}
