Description:
Accept:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1010, maxm = 10010;
const double inf = INT_MAX, eps = 1e-10;
struct Simplex {
double a[maxn][maxm], b[maxm], c[maxm], z;
int n, m;
void Init(int n_, int m_) {
n = n_, m = m_;
memset(c, 0, sizeof(c));
memset(a, 0, sizeof(a));
z = 0;
}
inline void Pivot(int k, int l) {
b[l] /= a[l][k];
for (int j = 0; j < n; j++)
if (j != k)a[l][j] /= a[l][k];
a[l][k] = 1 / a[l][k];
for (int i = 0; i < m; i++) {
if (i == l || fabs(a[i][k]) < eps)continue;
b[i] -= a[i][k] * b[l];
for (int j = 0; j < n; j++)
if (j != k)a[i][j] -= a[i][k] * a[l][j];
a[i][k] = -a[i][k] * a[l][k];
}
z += c[k] * b[l];
for (int j = 0; j < n; j++)
if (j != k)c[j] -= c[k] * a[l][j];
c[k] *= -a[l][k];
}
double Solve() {
while (true) {
int k = -1, l = -1;
double minc = inf;
for (int i = 0; i < n; i++) {
if (c[i] < minc) {
minc = c[i];
k = i;
}
}
if (minc > -eps)return z;
double minba = inf;
for (int i = 0; i < m; i++) {
if (a[i][k] > eps && minba > b[i] / a[i][k]) {
minba = b[i] / a[i][k];
l = i;
}
}
if (l == -1)return inf;
Pivot(k, l);
}
}
};
int n, m;
Simplex spx;
int main() {
cin >>n>>m; spx.Init(m, n);
for (int i = 0; i < n; i++) {
// cin >> spx.b[i];
scanf("%lf", &spx.b[i]);
}
for (int i = 0; i < m; i++) {
int l, r;
double v;
// cin >> l >> r >> v;
scanf("%d%d%lf", &l, &r, &v);
for (int j = l - 1; j < r; j++) {
spx.a[j][i] = 1;
}
spx.c[i] = -v;
}
ll ans = -(ll)(spx.Solve() - eps);printf("%lld\n", ans);
return 0;
}