1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define ft first
#define sd second
const int N=2e5+5;
int n,m;
struct node
{
int t,p,v,l,r;
}a[N];
int b[N],tr[N],f[N],tot;
void upd(int x,int k){
for(;x<=tot;x+=x&-x)
tr[x]=max(tr[x],k);
}
int qry(int x,int k=0){
for(;x;x-=x&-x)
k=max(k,tr[x]);
return k;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
int t,p,v;
scanf("%lld%lld%lld",&t,&p,&v);
a[i]={t,p,v,2*t-p,2*t+p};
b[i]=2*t+p;
}
sort(b+1,b+m+1);
tot=unique(b+1,b+m+1)-b-1;
for(int i=1;i<=m;i++)
a[i].r=lower_bound(b+1,b+tot+1,a[i].r)-b;
sort(a+1,a+m+1,[](node x,node y){
return x.l<y.l;
});
for(int i=1;i<=m;i++){
int tmp=qry(a[i].r);
upd(a[i].r,tmp+a[i].v);
}
printf("%lld\n",qry(tot));
return 0;
}
|