#include <bits/stdc++.h>
using namespace std;
void debug_out() { cerr << '\n'; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << ' ' << H;
  debug_out(T...);
}
const long long INF = 1e9;
const long long MOD = 1e9 + 7;
const int N = 1e5 + 5, Q = 5e3 + 5, LG = 18;
int n, q, A[LG][N], L[Q], R[Q], M[Q], W[Q];
double P[Q], DP[Q][Q];
stack<int> S;
vector<int> G[Q];
bool B[Q];
int RMQ(int l, int r) {
  int x = log2(r - l);
  return max(A[x][l], A[x][r - (1 << x)]);
}
void DFS(int v) {
  assert(!B[v]);
  B[v] = true;
  for (int i = 0; i < Q; i++) DP[v][i] = 1;
  for (int u : G[v]) DFS(u);
  for (int u : G[v])
    for (int i = 0; i < Q; i++) DP[v][i] *= DP[u][min(Q - 1, M[v] - M[u] + i)];
  for (int i = Q - 1; i >= 0; i--) {
    DP[v][i] *= 1 - P[v];
    if (i) DP[v][i] += P[v] * DP[v][i - 1];
  }
  return;
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> q;
  for (int i = 0; i < n; i++) cin >> A[0][i];
  for (int pw = 1; pw < LG; pw++)
    for (int i = 0; i < n; i++)
      A[pw][i] = max(A[pw - 1][i], A[pw - 1][i + (1 << (pw - 1))]);
  L[0] = 0, R[0] = n, M[0] = RMQ(0, n), P[0] = 0, S.push(0);
  for (int i = 1; i < q + 1; i++)
    cin >> L[i] >> R[i] >> P[i], M[i] = RMQ(--L[i], R[i]), W[i] = i;
  sort(W + 1, W + q + 1, [&](int i, int j) {
    return make_pair(L[i], -R[i]) < make_pair(L[j], -R[j]);
  });
  for (int i = 1; i < q + 1; i++) {
    while (R[S.top()] <= L[W[i]]) S.pop();
    G[S.top()].push_back(W[i]);
    S.push(W[i]);
  }
  DFS(0);
  double ans = DP[0][0] * M[0];
  for (int i = 1; i < Q; i++) ans += (DP[0][i] - DP[0][i - 1]) * (M[0] + i);
  cout << fixed << setprecision(6) << ans << '\n';
  return 0;
}
