#include <bits/stdc++.h>
using namespace std;
void output(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x == 0) {
    putchar('0');
    return;
  }
  int a[20], num = 0;
  while (x) a[++num] = x % 10, x /= 10;
  while (num > 0) putchar('0' + a[num--]);
}
inline long long myInt() {
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  int flag = 1;
  if (c == '-') flag = -1, c = getchar();
  long long x = 0;
  while (isdigit(c)) {
    x = (x * 10) + (c - '0');
    c = getchar();
  }
  if (flag == -1) return -x;
  return x;
}
const int N = 100005;
const int M = 5005;
int a[N], f[N][20];
int n, m;
struct node {
  int L, R, Max;
  double p;
};
node b[M];
void init() {
  for (int i = 1; i <= n; i++) f[i][0] = a[i];
  for (int j = 1; (1 << j) <= n; j++)
    for (int i = 1; i + (1 << j) - 1 <= n; i++) {
      f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
    }
}
int get(int L, int R) {
  int k = log2(R - L + 1);
  return max(f[L][k], f[R - (1 << k) + 1][k]);
}
int cmp(node a, node b) {
  if (a.L != b.L) return a.L < b.L;
  return a.R > b.R;
}
double dp[M][M];
int visit[M];
vector<int> g[M];
void DFS(int u) {
  if (visit[u]) return;
  visit[u] = 1;
  for (int i = 0; i < g[u].size(); i++) DFS(g[u][i]);
  for (int i = 0; i <= m; i++) {
    double tmp1 = i > 0 ? 1 : 0;
    double tmp2 = 1;
    for (int j = 0; j < g[u].size(); j++) {
      int t = g[u][j];
      int k = b[u].Max - b[t].Max + i - 1;
      if (k >= 0)
        tmp1 *= dp[t][min(k, m)];
      else
        tmp1 = 0;
      k++;
      if (k >= 0)
        tmp2 *= dp[t][min(k, m)];
      else
        tmp2 = 0;
    }
    dp[u][i] = b[u].p * tmp1 + (1 - b[u].p) * tmp2;
  }
}
int main() {
  n = myInt();
  m = myInt();
  for (int i = 1; i <= n; i++) a[i] = myInt();
  init();
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%lf", &b[i].L, &b[i].R, &b[i].p);
    b[i].Max = get(b[i].L, b[i].R);
  }
  m++;
  b[m].L = 1;
  b[m].R = n;
  b[m].p = 0;
  b[m].Max = get(1, n);
  sort(b + 1, b + m + 1, cmp);
  for (int i = 1; i <= m; i++)
    for (int j = i - 1; j >= 0; j--) {
      if (b[i].L >= b[j].L && b[i].R <= b[j].R) {
        g[j].push_back(i);
        break;
      }
    }
  DFS(1);
  double ans = dp[1][0] * b[1].Max;
  for (int i = 1; i <= m; i++) {
    ans += (dp[1][i] - dp[1][i - 1]) * (b[1].Max + i);
  }
  printf("%.10lf\n", ans);
}
