#include <bits/stdc++.h>
using namespace std;
pair<pair<int, int>, double> qu[5010];
map<pair<int, int>, int> mp;
vector<int> adj[5010];
int mx[20][100010], ar[100010], p[5010], val[5010], n, q;
int rmq(int a, int b) {
  int idx = 0, len = b - a + 1;
  while (len > 1) {
    len >>= 1;
    idx++;
  }
  if (ar[mx[idx][a]] > ar[mx[idx][b - (1 << idx) + 1]])
    return mx[idx][a];
  else
    return mx[idx][b - (1 << idx) + 1];
}
double dp[5010][5010];
void cal(int a) {
  int len = adj[a].size();
  if (len == 0) {
    dp[a][0] = 1 - qu[a].second;
    for (int j = 1; j <= q; j++) {
      dp[a][j] = 1;
    }
    return;
  }
  for (int i = 0; i < len; i++) {
    cal(adj[a][i]);
  }
  double ans1, ans2;
  int now, temp;
  for (int j = 0; j <= q; j++) {
    ans1 = qu[a].second, ans2 = 1 - ans1;
    for (int i = 0; i < len; i++) {
      now = adj[a][i];
      temp = val[a] - val[now] + j;
      if (temp - 1 >= 0 && temp - 1 <= q) {
        ans1 *= dp[now][temp - 1];
      } else if (temp - 1 < 0) {
        ans1 = 0;
      }
      if (temp >= 0 && temp <= q) {
        ans2 *= dp[now][temp];
      }
    }
    if (j == 0) ans1 = 0;
    dp[a][j] = ans1 + ans2;
  }
}
void solve() {
  scanf("%d", &n);
  ;
  scanf("%d", &q);
  ;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &ar[i]);
    ;
    mx[0][i] = i;
  }
  for (int j = 1; j < 20; j++) {
    for (int i = 1; i <= n - (1 << j) + 1; i++) {
      mx[j][i] = mx[j - 1][i + (1 << (j - 1))];
      if (ar[mx[j - 1][i]] > ar[mx[j][i]]) {
        mx[j][i] = mx[j - 1][i];
      }
    }
  }
  q++;
  qu[0].first.first = 1;
  qu[0].first.second = -n - 1;
  qu[0].second = 0;
  int idx = 1;
  for (int i = 1; i < q; i++) {
    scanf("%d", &qu[idx].first.first);
    ;
    scanf("%d", &qu[idx].first.second);
    ;
    cin >> qu[idx].second;
    qu[idx].first.second = -qu[idx].first.second;
    idx++;
  }
  q = idx;
  sort(qu, qu + q);
  int x = 0;
  val[0] = ar[rmq(1, n)];
  p[0] = -1;
  for (int i = 1; i < q; i++) {
    x = i - 1;
    while (!(qu[i].first.first >= qu[x].first.first &&
             qu[i].first.second >= qu[x].first.second))
      x = p[x];
    if (qu[i].first.first >= qu[x].first.first &&
        qu[i].first.second >= qu[x].first.second) {
      val[i] = ar[rmq(qu[i].first.first, -qu[i].first.second)];
      p[i] = x;
      adj[x].push_back(i);
    }
  }
  cal(0);
  double ans = val[0];
  for (int i = 1; i <= q; i++) {
    ans += (dp[0][i] - dp[0][i - 1]) * i;
  }
  printf("%.8lf\n", ans);
}
int main() {
  int t = 1;
  while (t--) {
    solve();
  }
}
