Problem:
Score : 100 points

Problem Statement

Consider a string of length N consisting of 0 and 1.
The score for the string is calculated as follows:

For each i (1 \leq i \leq M), a_i is added to the score if the string contains 1 at least once between the l_i-th and r_i-th characters (inclusive).

Find the maximum possible score of a string.

Constraints

All values in input are integers.

1 \leq N \leq 2 × 10^5

1 \leq M \leq 2 × 10^5

1 \leq l_i \leq r_i \leq N

|a_i| \leq 10^9

Input

Input is given from Standard Input in the following format:

N M
l_1 r_1 a_1
l_2 r_2 a_2
:
l_M r_M a_M

Output

Print the maximum possible score of a string.

Sample Input 1

5 3
1 3 10
2 4 -10
3 5 10

Sample Output 1

20

The score for 10001 is a_1 + a_3 = 10 + 10 = 20.

Sample Input 2

3 4
1 3 100
1 1 -10
2 2 -20
3 3 -30

Sample Output 2

90

The score for 100 is a_1 + a_2 = 100 + (-10) = 90.

Sample Input 3

1 1
1 1 -10

Sample Output 3

0

The score for 0 is 0.

Sample Input 4

1 5
1 1 1000000000
1 1 1000000000
1 1 1000000000
1 1 1000000000
1 1 1000000000

Sample Output 4

5000000000

The answer may not fit into a 32-bit integer type.

Sample Input 5

6 8
5 5 3
1 1 10
1 6 -8
3 6 5
3 4 9
5 5 -2
1 3 -6
4 6 -7

Sample Output 5

10

For example, the score for 101000 is a_2 + a_3 + a_4 + a_5 + a_7 = 10 + (-8) + 5 + 9 + (-6) = 10.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Collections;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using static System.Math;
using System.Numerics;
static class Program{
	const int mod=(int)1e9+7;
	const double eps=1e-11;
	static void Main(){
		Sc sc=new Sc();
		var s=sc.Ia;
		St st=new St(s[0]+1,true);
		var h=new int[s[1]][];
		var g=new int[s[1]][];
		for(int i = 0;i<s[1];i++) {h[i]=g[i]=sc.Ia3(i);}
		Array.Sort(h,(u,v)=>u[1]-v[1]);
		Array.Sort(g,(u,v)=>u[2]-v[2]);
		for(int i = 1,j=0,k=0;i<=s[0];i++) {
			while(j<s[1]&&h[j][1]==i){
				st.Ud2(0,h[j][1]-1,h[j][3]);
				j++;
			}
			st.Ud2(i,i,st.Get(0,i-1).d);
			while(k<s[1]&&g[k][2]==i){
				st.Ud2(0,g[k][1]-1,-g[k][3]);
				k++;
			}
		}
		Console.WriteLine("{0}",st.Get(0,s[0]).d);
	}
}
public class St{
	public class Mo{
		public int n;
		public long d,c=0;
		public Mo(long d,int n){this.d=d;this.n=n;}
		public Mo(Mo mo){d=mo.d+mo.c;n=mo.n;}
	}
	public Mo[] dat;
	private int m=1,cnt;
	private bool mm;
	private Mo du;
	private Func<Mo,Mo,bool> compare;
	public St(int n,bool mm){
		this.mm=mm;
		if(mm){du=new Mo(long.MinValue,-1);compare=CoMax;}
		else{du=new Mo(long.MaxValue,-1);compare=CoMin;}
		while(m<n){m<<=1;}
		cnt=m+n-1;
		dat=new Mo[cnt+1];
		for(int i=m-1;i<=cnt;i++){dat[i]=new Mo(0,i-m+1);}
		for(int i=m-2;i>=0;i--){
			if(2*i+1>=cnt){dat[i]=new Mo(0,-1);}
			else{dat[i]=new Mo(0,dat[2*i+1].n);}
		}
	}
	private bool CoMax(Mo x,Mo y){return x.d>y.d;}
	private bool CoMin(Mo x,Mo y){return x.d<y.d;}
	private Mo Fdg(int a,int b,int k,int l,int r){
		if(dat[k].c!=0){
			dat[k].d+=dat[k].c;
			if(2*k+2<cnt){dat[2*k+1].c+=dat[k].c;dat[2*k+2].c+=dat[k].c;}
			else if(2*k+2==cnt){dat[2*k+1].d+=dat[k].c;}
			dat[k].c=0;
		}
		if(r<a||b<l){return du;}
		if(a<=l&&r<=b){return dat[k];}
		Mo p=Fdg(a,b,k*2+1,l,(l+r)>>1);
		Mo q=Fdg(a,b,k*2+2,(l+r+1)>>1,r);
		return compare(p,q)?p:q;
	}
	public Mo Get(int a,int b){return Fdg(a,b,0,0,m-1);}
	public void Ud2(int a,int b,long d){Hn(a,b,0,0,m-1,d);}
	private Mo Hn(int a,int b,int k,int l,int r,long d){
		if(a<=l&&r<=b){
			dat[k].d+=dat[k].c+d;
			if(2*k+2<cnt){dat[2*k+1].c+=dat[k].c+d;dat[2*k+2].c+=dat[k].c+d;}
			else if(2*k+2==cnt){dat[2*k+1].d+=dat[k].c+d;}
			dat[k].c=0;
			return dat[k];
		}
		if(dat[k].c!=0){
			dat[k].d+=dat[k].c;
			if(2*k+2<cnt){dat[2*k+1].c+=dat[k].c;dat[2*k+2].c+=dat[k].c;}
			else if(2*k+2==cnt){dat[2*k+1].d+=dat[k].c;}
			dat[k].c=0;
		}
		if(r>=a&&b>=l){
			Mo p=new Mo(Hn(a,b,k*2+1,l,(l+r)>>1,d));
			Mo q=new Mo(Hn(a,b,k*2+2,(l+r+1)>>1,r,d));
			dat[k]=compare(p,q)?p:q;
			return dat[k];
		}
		return dat[k];
	}
}
public class Sc{
	public int I{get{return int.Parse(Console.ReadLine());}}
	public long L{get{return long.Parse(Console.ReadLine());}}
	public double D{get{return double.Parse(Console.ReadLine());}}
	public string S{get{return Console.ReadLine();}}
	public int[] Ia{get{return Array.ConvertAll(Console.ReadLine().Split(),int.Parse);}}
	public long[] La{get{return Array.ConvertAll(Console.ReadLine().Split(),long.Parse);}}
	public double[] Da{get{return Array.ConvertAll(Console.ReadLine().Split(),double.Parse);}}
	public string[] Sa{get{return Console.ReadLine().Split();}}
	public object[] Oa{get{return Console.ReadLine().Split();}}
	public int[] Ia2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),int.Parse);}}
	public int[] Ia3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),int.Parse);}
	public int[] Ia3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),int.Parse);}
	public long[] La2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),long.Parse);}}
	public long[] La3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),long.Parse);}
	public long[] La3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),long.Parse);}
	public double[] Da2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),double.Parse);}}
	public double[] Da3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),double.Parse);}
	public double[] Da3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),double.Parse);}
	public T[] Arr<T>(int n,Func<T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f();}return a;}
	public T[] Arr<T>(int n,Func<int,T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f(i);}return a;}
	public T[] Arr<T>(int n,Func<string[],T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f(Console.ReadLine().Split());}return a;}
	public T[] Arr<T>(int n,Func<int,string[],T> f){var a=new T[n];for(int i=0;i<n;i++){a[i]=f(i,Console.ReadLine().Split());}return a;}
}