#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T1, class T2> void sortA_L( int N, T1 a[ ] , T2 b[ ] , void * mem = wmem) {
int i;
pair< T1, T2> * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first = a[ i] ;
arr[ i] .second = b[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first ;
b[ i] = arr[ i] .second ;
}
}
template < class T1, class T2, class T3> void sortA_L( int N, T1 a[ ] , T2 b[ ] , T3 c[ ] , void * mem = wmem) {
int i;
pair< T1, pair< T2, T3> > * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first = a[ i] ;
arr[ i] .second .first = b[ i] ;
arr[ i] .second .second = c[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first ;
b[ i] = arr[ i] .second .first ;
c[ i] = arr[ i] .second .second ;
}
}
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
template < class T> int coordcomp_L( int n, T arr[ ] , int res[ ] = NULL , void * mem = wmem) {
int i;
int k = 0 ;
pair< T,int > * r;
walloc1d( & r, n, & mem) ;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
r[ i] .first = arr[ i] ;
r[ i] .second = i;
}
sort( r, r+ n) ;
if ( res ! = NULL ) {
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
if ( i && r[ i] .first ! = r[ i- 1 ] .first ) {
k++ ;
}
res[ r[ i] .second ] = k;
}
}
else {
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
if ( i && r[ i] .first ! = r[ i- 1 ] .first ) {
k++ ;
}
arr[ r[ i] .second ] = k;
}
}
return k+ 1 ;
}
template < class T> int coordcomp_L( int n1, T arr1[ ] , int n2, T arr2[ ] , int res1[ ] = NULL , int res2[ ] = NULL , void * mem = wmem) {
int i;
int k = 0 ;
pair< T,int > * r;
walloc1d( & r, n1+ n2, & mem) ;
for ( i= ( 0 ) ; i< ( n1) ; i++ ) {
r[ i] .first = arr1[ i] ;
r[ i] .second = i;
}
for ( i= ( 0 ) ; i< ( n2) ; i++ ) {
r[ n1+ i] .first = arr2[ i] ;
r[ n1+ i] .second = n1+ i;
}
sort( r, r+ n1+ n2) ;
for ( i= ( 0 ) ; i< ( n1+ n2) ; i++ ) {
if ( i && r[ i] .first ! = r[ i- 1 ] .first ) {
k++ ;
}
if ( r[ i] .second < n1) {
if ( res1! = NULL ) {
res1[ r[ i] .second ] = k;
}
else {
arr1[ r[ i] .second ] = k;
}
}
else {
if ( res2! = NULL ) {
res2[ r[ i] .second - n1] = k;
}
else {
arr2[ r[ i] .second - n1] = k;
}
}
}
return k+ 1 ;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
int N;
int M;
int A[ 100000 ] ;
int B[ 100000 ] ;
int C[ 100000 ] ;
int dp[ 200000 ] ;
class Solution{
public :
int jobScheduling( vector< int > & startTime, vector< int > & endTime, vector< int > & profit) {
int i;
dummy_main( ) ;
int k = 0 ;
N = startTime.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
A[ i] = startTime[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
B[ i] = endTime[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
C[ i] = profit[ i] ;
}
M = coordcomp_L( N, A, N, B) ;
sortA_L( N, A, B, C) ;
for ( i= ( 0 ) ; i< ( M+ 1 ) ; i++ ) {
dp[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
chmax( dp[ i+ 1 ] , dp[ i] ) ;
while ( k < N && A[ k] == i) {
chmax( dp[ B[ k] ] , dp[ i] + C[ k] ) ;
k++ ;
}
}
return dp[ M] ;
}
}
;
// cLay varsion 20191102-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int N, M;
// int A[1d5], B[1d5], C[1d5];
// int dp[2d5];
//
// class Solution {
// public:
// int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {
// dummy_main();
// int k = 0;
// N = startTime.size();
// rep(i,N) A[i] = startTime[i];
// rep(i,N) B[i] = endTime[i];
// rep(i,N) C[i] = profit[i];
// M = coordcomp(N, A, N, B);
// sortA(N, A, B, C);
// rep(i,M+1) dp[i] = 0;
// rep(i,M){
// dp[i+1] >?= dp[i];
// while(k < N && A[k] == i) dp[B[k]] >?= dp[i] + C[k], k++;
// }
// return dp[M];
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQp0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+IHZvaWQgc29ydEFfTChpbnQgTiwgVDEgYVtdLCBUMiBiW10sIHZvaWQgKm1lbSA9IHdtZW0pewogIGludCBpOwogIHBhaXI8VDEsIFQyPiAqYXJyOwogIHdhbGxvYzFkKCZhcnIsIE4sICZtZW0pOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYXJyW2ldLmZpcnN0ID0gYVtpXTsKICAgIGFycltpXS5zZWNvbmQgPSBiW2ldOwogIH0KICBzb3J0KGFyciwgYXJyK04pOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYVtpXSA9IGFycltpXS5maXJzdDsKICAgIGJbaV0gPSBhcnJbaV0uc2Vjb25kOwogIH0KfQp0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzPiB2b2lkIHNvcnRBX0woaW50IE4sIFQxIGFbXSwgVDIgYltdLCBUMyBjW10sIHZvaWQgKm1lbSA9IHdtZW0pewogIGludCBpOwogIHBhaXI8VDEsIHBhaXI8VDIsIFQzPiA+ICphcnI7CiAgd2FsbG9jMWQoJmFyciwgTiwgJm1lbSk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnJbaV0uZmlyc3QgPSBhW2ldOwogICAgYXJyW2ldLnNlY29uZC5maXJzdCA9IGJbaV07CiAgICBhcnJbaV0uc2Vjb25kLnNlY29uZCA9IGNbaV07CiAgfQogIHNvcnQoYXJyLCBhcnIrTik7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhW2ldID0gYXJyW2ldLmZpcnN0OwogICAgYltpXSA9IGFycltpXS5zZWNvbmQuZmlyc3Q7CiAgICBjW2ldID0gYXJyW2ldLnNlY29uZC5zZWNvbmQ7CiAgfQp9CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIGNobWF4KFMgJmEsIFQgYil7CiAgaWYoYTxiKXsKICAgIGE9YjsKICB9CiAgcmV0dXJuIGE7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW50IGNvb3JkY29tcF9MKGludCBuLCBUIGFycltdLCBpbnQgcmVzW10gPSBOVUxMLCB2b2lkICptZW0gPSB3bWVtKXsKICBpbnQgaTsKICBpbnQgayA9IDA7CiAgcGFpcjxULGludD4gKnI7CiAgd2FsbG9jMWQoJnIsIG4sICZtZW0pOwogIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgcltpXS5maXJzdCA9IGFycltpXTsKICAgIHJbaV0uc2Vjb25kID0gaTsKICB9CiAgc29ydChyLCByK24pOwogIGlmKHJlcyAhPSBOVUxMKXsKICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBpZihpICYmIHJbaV0uZmlyc3QgIT0gcltpLTFdLmZpcnN0KXsKICAgICAgICBrKys7CiAgICAgIH0KICAgICAgcmVzW3JbaV0uc2Vjb25kXSA9IGs7CiAgICB9CiAgfQogIGVsc2V7CiAgICBmb3IoaT0oMCk7aTwobik7aSsrKXsKICAgICAgaWYoaSAmJiByW2ldLmZpcnN0ICE9IHJbaS0xXS5maXJzdCl7CiAgICAgICAgaysrOwogICAgICB9CiAgICAgIGFycltyW2ldLnNlY29uZF0gPSBrOwogICAgfQogIH0KICByZXR1cm4gaysxOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IGludCBjb29yZGNvbXBfTChpbnQgbjEsIFQgYXJyMVtdLCBpbnQgbjIsIFQgYXJyMltdLCBpbnQgcmVzMVtdID0gTlVMTCwgaW50IHJlczJbXSA9IE5VTEwsIHZvaWQgKm1lbSA9IHdtZW0pewogIGludCBpOwogIGludCBrID0gMDsKICBwYWlyPFQsaW50PiAqcjsKICB3YWxsb2MxZCgmciwgbjErbjIsICZtZW0pOwogIGZvcihpPSgwKTtpPChuMSk7aSsrKXsKICAgIHJbaV0uZmlyc3QgPSBhcnIxW2ldOwogICAgcltpXS5zZWNvbmQgPSBpOwogIH0KICBmb3IoaT0oMCk7aTwobjIpO2krKyl7CiAgICByW24xK2ldLmZpcnN0ID0gYXJyMltpXTsKICAgIHJbbjEraV0uc2Vjb25kID0gbjEraTsKICB9CiAgc29ydChyLCByK24xK24yKTsKICBmb3IoaT0oMCk7aTwobjErbjIpO2krKyl7CiAgICBpZihpICYmIHJbaV0uZmlyc3QgIT0gcltpLTFdLmZpcnN0KXsKICAgICAgaysrOwogICAgfQogICAgaWYocltpXS5zZWNvbmQgPCBuMSl7CiAgICAgIGlmKHJlczEhPU5VTEwpewogICAgICAgIHJlczFbcltpXS5zZWNvbmRdID0gazsKICAgICAgfQogICAgICBlbHNlewogICAgICAgIGFycjFbcltpXS5zZWNvbmRdID0gazsKICAgICAgfQogICAgfQogICAgZWxzZXsKICAgICAgaWYocmVzMiE9TlVMTCl7CiAgICAgICAgcmVzMltyW2ldLnNlY29uZC1uMV0gPSBrOwogICAgICB9CiAgICAgIGVsc2V7CiAgICAgICAgYXJyMltyW2ldLnNlY29uZC1uMV0gPSBrOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBrKzE7Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICB3bWVtID0gbWVtYXJyOwogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCmludCBOOwppbnQgTTsKaW50IEFbMTAwMDAwXTsKaW50IEJbMTAwMDAwXTsKaW50IENbMTAwMDAwXTsKaW50IGRwWzIwMDAwMF07CmNsYXNzIFNvbHV0aW9uewogIHB1YmxpYzoKICBpbnQgam9iU2NoZWR1bGluZyh2ZWN0b3I8aW50PiYgc3RhcnRUaW1lLCB2ZWN0b3I8aW50PiYgZW5kVGltZSwgdmVjdG9yPGludD4mIHByb2ZpdCl7CiAgICBpbnQgaTsKICAgIGR1bW15X21haW4oKTsKICAgIGludCBrID0gMDsKICAgIE4gPSBzdGFydFRpbWUuc2l6ZSgpOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIEFbaV0gPSBzdGFydFRpbWVbaV07CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgQltpXSA9IGVuZFRpbWVbaV07CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgQ1tpXSA9IHByb2ZpdFtpXTsKICAgIH0KICAgIE0gPWNvb3JkY29tcF9MKE4sIEEsIE4sIEIpOwogICAgc29ydEFfTChOLCBBLCBCLCBDKTsKICAgIGZvcihpPSgwKTtpPChNKzEpO2krKyl7CiAgICAgIGRwW2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChNKTtpKyspewogICAgICBjaG1heChkcFtpKzFdLCBkcFtpXSk7CiAgICAgIHdoaWxlKGsgPCBOICYmIEFba10gPT0gaSl7CiAgICAgICAgY2htYXgoZHBbQltrXV0sIGRwW2ldICsgQ1trXSk7CiAgICAgICAgaysrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZHBbTV07CiAgfQp9CjsKLy8gY0xheSB2YXJzaW9uIDIwMTkxMTAyLTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gaW50IE4sIE07Ci8vIGludCBBWzFkNV0sIEJbMWQ1XSwgQ1sxZDVdOwovLyBpbnQgZHBbMmQ1XTsKLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIGludCBqb2JTY2hlZHVsaW5nKHZlY3RvcjxpbnQ+JiBzdGFydFRpbWUsIHZlY3RvcjxpbnQ+JiBlbmRUaW1lLCB2ZWN0b3I8aW50PiYgcHJvZml0KSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vICAgICBpbnQgayA9IDA7Ci8vICAgICBOID0gc3RhcnRUaW1lLnNpemUoKTsKLy8gICAgIHJlcChpLE4pIEFbaV0gPSBzdGFydFRpbWVbaV07Ci8vICAgICByZXAoaSxOKSBCW2ldID0gZW5kVGltZVtpXTsKLy8gICAgIHJlcChpLE4pIENbaV0gPSBwcm9maXRbaV07Ci8vICAgICBNID0gY29vcmRjb21wKE4sIEEsIE4sIEIpOwovLyAgICAgc29ydEEoTiwgQSwgQiwgQyk7Ci8vICAgICByZXAoaSxNKzEpIGRwW2ldID0gMDsKLy8gICAgIHJlcChpLE0pewovLyAgICAgICBkcFtpKzFdID4/PSBkcFtpXTsKLy8gICAgICAgd2hpbGUoayA8IE4gJiYgQVtrXSA9PSBpKSBkcFtCW2tdXSA+Pz0gZHBbaV0gKyBDW2tdLCBrKys7Ci8vICAgICB9Ci8vICAgICByZXR1cm4gZHBbTV07Ci8vICAgfQovLyB9Owo=