#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9, pi = acos(-1.0);
struct Data {
  int num;
  Data() : num(-1) { ; }
  Data(int n) : num(n) { ; }
};
inline Data Merge(Data left, Data right) {
  return Data(left.num > right.num ? left.num : right.num);
}
struct SegmentTree {
  int n;
  vector<Data> data;
  SegmentTree(int N) : n(1 << N), data(n * 2) {}
  void update(int pos, Data value) {
    data[pos] = value;
    while (pos < 2 * n - 1) {
      int l = pos, r = pos ^ 1;
      if (l > r) swap(l, r);
      pos = pos / 2 + n;
      data[pos] = Merge(data[l], data[r]);
    }
  }
  Data sub(int fr, int to, int node, int la, int ra) {
    if (ra <= fr || to <= la) return Data();
    if (fr <= la && ra <= to) return data[node];
    Data vl = sub(fr, to, (node - n) * 2 + 0, la, (la + ra) / 2);
    Data vr = sub(fr, to, (node - n) * 2 + 1, (la + ra) / 2, ra);
    return Merge(vl, vr);
  }
  Data query(int fr, int to) { return sub(fr, to, 2 * n - 2, 0, n); }
};
vector<int> g[5010];
int A[5010];
double P[5010];
pair<int, vector<double>> merge(const pair<int, vector<double>> &a,
                                const pair<int, vector<double>> &b) {
  int x = max(a.first, b.first);
  vector<double> res(5010);
  for (int i = 0; i < (int)(5010); i++) {
    res[i] = (i + x - a.first < 5005 ? a.second[i + x - a.first] : 1) *
             (i + x - b.first < 5005 ? b.second[i + x - b.first] : 1);
  }
  return make_pair(x, res);
}
pair<int, vector<double>> dp(int v) {
  vector<double> resv(5010, 1);
  pair<int, vector<double>> res = make_pair(A[v], resv);
  for (int i : g[v]) res = merge(res, dp(i));
  resv = vector<double>(5010, 0);
  for (int i = 0; i < (int)(5009); i++) {
    resv[i] += res.second[i] * (1 - P[v]);
    resv[i + 1] += res.second[i] * P[v];
  }
  res.second = resv;
  return res;
}
int main() {
  cout << setprecision(9) << fixed;
  int N, Q;
  scanf("%d%d", &N, &Q);
  vector<tuple<int, int, int, double>> vec(Q + 1);
  vec[0] = make_tuple(-N, 0, N, 0.0);
  SegmentTree seg(17);
  for (int i = 0; i < (int)(N); i++) {
    int in;
    scanf("%d", &in);
    seg.update(i, in);
  }
  for (int i = 0; i < (int)(Q); i++) {
    int l, r;
    double p;
    scanf("%d%d%lf", &l, &r, &p);
    vec[i + 1] = make_tuple(l - r, l - 1, r, p);
  }
  sort((vec).begin(), (vec).end());
  A[0] = seg.query(0, N).num;
  P[0] = 0;
  for (int i = 1; i <= Q; ++i) {
    int pos = -1, l, r;
    double p;
    tie(ignore, l, r, p) = vec[i];
    for (int j = i - 1; j >= 0; --j) {
      if (get<1>(vec[j]) <= get<1>(vec[i]) &&
          get<2>(vec[i]) <= get<2>(vec[j])) {
        pos = j;
        break;
      }
    }
    g[pos].push_back(i);
    P[i] = p;
    A[i] = seg.query(l, r).num;
  }
  pair<int, vector<double>> v = dp(0);
  double res = v.first * v.second[0];
  for (int i = 0; i < 5005; ++i)
    res += (v.second[i + 1] - v.second[i]) * (v.first + i + 1);
  cout << res << endl;
  return 0;
}
