#include <bits/stdc++.h>
using namespace std;
int n, q, a[100010];
struct seg {
  int l, r, id;
  double p;
  void input() { scanf("%d%d%lf", &l, &r, &p); }
} f[5050];
vector<int> in[100010];
vector<int> g[5050];
struct data {
  int st;
  vector<double> v;
  data(int _st = 0) : st(_st) {}
};
data mul(const data &a, const data &b) {
  data c;
  c.st = max(a.st, b.st);
  int en = max(a.st + a.v.size(), b.st + b.v.size());
  c.v.resize(en - c.st);
  for (int i = 0; i < c.v.size(); i++) {
    c.v[i] = 1;
    if (c.st + i < a.st + a.v.size()) c.v[i] *= a.v[c.st + i - a.st];
    if (c.st + i < b.st + b.v.size()) c.v[i] *= b.v[c.st + i - b.st];
  }
  return c;
}
data func(data &a, double p) {
  data c = a;
  c.v.push_back(1 - p);
  for (int i = a.v.size() - 1; i >= 0; i--) {
    c.v[i] = a.v[i] * (1 - p);
    c.v[i + 1] += a.v[i] * p;
  }
  return c;
}
data dfs(int u) {
  int l = f[u].l, r = f[u].r;
  int st = r + 1;
  data c(0);
  if (!g[u].empty()) st = f[g[u][0]].l;
  if (l < st) {
    int mx = 0;
    for (int i = l; i < st; i++) mx = max(mx, a[i]);
    c = data(mx);
  }
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    c = mul(c, dfs(v));
    int en = r;
    if (i + 1 < g[u].size()) en = f[g[u][i + 1]].l - 1;
    int mx = 0;
    for (int j = f[g[u][i]].r + 1; j <= en; j++) mx = max(mx, a[j]);
    c = mul(c, data(mx));
  }
  c = func(c, f[u].p);
  return c;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= q; i++) {
    f[i].input(), f[i].id = i;
    in[f[i].l].push_back(i);
  }
  f[0].l = 1, f[0].r = n, f[0].p = 0;
  stack<int> S;
  S.push(0);
  for (int i = 1; i <= n; i++) {
    sort(in[i].begin(), in[i].end(),
         [&](int x, int y) { return f[x].r > f[y].r; });
    for (auto p : in[i]) {
      int q = S.top();
      g[q].push_back(p);
      S.push(p);
    }
    while (!S.empty() && f[S.top()].r == i) S.pop();
  }
  data c = dfs(0);
  double ans = c.st;
  vector<double> &v = c.v;
  for (int i = 1; i < v.size(); i++) ans += i * (v[i] - v[i - 1]);
  printf("%.12lf", ans);
  return 0;
}
