#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int M=1000006;
const int N=1000006;
struct tnum{
ll l,r,v;
};
tnum a[M];
ll n,m,c[N],f[N][2],k[N][2];
bool cmp(tnum a,tnum b){
if (a.l==b.l) return a.r<b.r;
return a.l<b.l;
}
ll calc_cost(int l,int r){
if (l>r) return 0;
return c[r]-c[l-1];
}
int main(){
cin>>n>>m;
for (int i=1;i<=n;i++) cin>>c[i];
for (int i=1;i<=n;i++) c[i]+=c[i-1];
for (int i=1;i<=m;i++)
cin>>a[i].l>>a[i].r>>a[i].v;
sort(a+1,a+m+1,cmp);
memset(f,0x80,sizeof(f));
f[0][0]=0;f[0][1]=0;
for (int i=1;i<=m;i++){
if (f[i][1]<=f[i-1][0]+a[i].v-calc_cost(max(k[i-1][0]+1,a[i].l),a[i].r)){
f[i][1]=f[i-1][0]+a[i].v-calc_cost(max(k[i-1][0]+1,a[i].l),a[i].r);
k[i][1]=max(k[i][1],max(k[i-1][0],a[i].r));
}
if (f[i][1]<=f[i-1][1]+a[i].v-calc_cost(max(k[i-1][1]+1,a[i].l),a[i].r)){
f[i][1]=f[i-1][1]+a[i].v-calc_cost(max(k[i-1][1]+1,a[i].l),a[i].r);
k[i][1]=max(k[i][1],max(k[i-1][1],a[i].r));
}
if (f[i][0]<=f[i-1][1]){
f[i][0]=f[i-1][1];
k[i][0]=max(k[i][0],k[i-1][1]);
}
if (f[i][0]<=f[i-1][0]){
f[i][0]=f[i-1][0];
k[i][0]=max(k[i][0],k[i-1][0]);
}
}
cout<<max(f[m][0],f[m][1]);
return 0;
}
用的方法是f[i][0/1]表示选或不选第i个
想要用这种思路设计状态,但是只ac了一个点