#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
template < class S, class T> inline S chmin( S & a, T b) {
if ( a> b) {
a= b;
}
return a;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
class Solution{
public :
int makeArrayIncreasing( vector< int > & A, vector< int > & B) {
int i;
int j;
int k;
int N;
int M;
int dp[ 2001 ] ;
int nx[ 2001 ] ;
N = A.size ( ) ;
M = B.size ( ) ;
sort( B.begin ( ) , B.end ( ) ) ;
for ( i= 0 ; i< ( N+ 1 ) ; i++ ) {
dp[ i] = 1073709056 ;
}
dp[ 0 ] = - 1 ;
for ( i= 0 ; i< ( N) ; i++ ) {
for ( k= 0 ; k< ( N+ 1 ) ; k++ ) {
nx[ k] = 1073709056 ;
}
for ( k= 0 ; k< ( N+ 1 ) ; k++ ) {
if ( dp[ k] < A[ i] ) {
chmin( nx[ k] , A[ i] ) ;
}
}
for ( k= 0 ; k< ( N) ; k++ ) {
if ( dp[ k] < 1073709056 ) {
j = upper_bound( B.begin ( ) , B.end ( ) , dp[ k] ) - B.begin ( ) ;
if ( j < M) {
chmin( nx[ k+ 1 ] , B[ j] ) ;
}
}
}
for ( k= 0 ; k< ( N+ 1 ) ; k++ ) {
dp[ k] = nx[ k] ;
}
}
for ( i= 0 ; i< ( N+ 1 ) ; i++ ) {
if ( dp[ i] < 1073709056 ) {
return i;
}
}
return - 1 ;
}
}
;
// cLay varsion 20190914-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// int makeArrayIncreasing(vector<int>& A, vector<int>& B) {
// int i, j, k;
// int N, M;
// int dp[2001], nx[2001];
//
// N = A.size();
// M = B.size();
// sort(B.begin(), B.end());
//
// rep(i,N+1) dp[i] = int_inf;
// dp[0] = -1;
// rep(i,N){
// rep(k,N+1) nx[k] = int_inf;
// rep(k,N+1) if(dp[k] < A[i]) nx[k] <?= A[i];
// rep(k,N) if(dp[k] < int_inf) {
// j = upper_bound(B.begin(), B.end(), dp[k]) - B.begin();
// if(j < M) nx[k+1] <?= B[j];
// }
// rep(k,N+1) dp[k] = nx[k];
// }
//
// rep(i,N+1) if(dp[i] < int_inf) return i;
// return -1;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIGNobWluKFMgJmEsIFQgYil7CiAgaWYoYT5iKXsKICAgIGE9YjsKICB9CiAgcmV0dXJuIGE7Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgaW50IG1ha2VBcnJheUluY3JlYXNpbmcodmVjdG9yPGludD4mIEEsIHZlY3RvcjxpbnQ+JiBCKXsKICAgIGludCBpOwogICAgaW50IGo7CiAgICBpbnQgazsKICAgIGludCBOOwogICAgaW50IE07CiAgICBpbnQgZHBbMjAwMV07CiAgICBpbnQgbnhbMjAwMV07CiAgICBOID0gQS5zaXplKCk7CiAgICBNID0gQi5zaXplKCk7CiAgICBzb3J0KEIuYmVnaW4oKSwgQi5lbmQoKSk7CiAgICBmb3IoaT0wO2k8KE4rMSk7aSsrKXsKICAgICAgZHBbaV0gPSAxMDczNzA5MDU2OwogICAgfQogICAgZHBbMF0gPSAtMTsKICAgIGZvcihpPTA7aTwoTik7aSsrKXsKICAgICAgZm9yKGs9MDtrPChOKzEpO2srKyl7CiAgICAgICAgbnhba10gPSAxMDczNzA5MDU2OwogICAgICB9CiAgICAgIGZvcihrPTA7azwoTisxKTtrKyspewogICAgICAgIGlmKGRwW2tdIDwgQVtpXSl7CiAgICAgICAgICBjaG1pbihueFtrXSwgQVtpXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvcihrPTA7azwoTik7aysrKXsKICAgICAgICBpZihkcFtrXSA8IDEwNzM3MDkwNTYpewogICAgICAgICAgaiA9IHVwcGVyX2JvdW5kKEIuYmVnaW4oKSwgQi5lbmQoKSwgZHBba10pIC0gQi5iZWdpbigpOwogICAgICAgICAgaWYoaiA8IE0pewogICAgICAgICAgICBjaG1pbihueFtrKzFdLCBCW2pdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yKGs9MDtrPChOKzEpO2srKyl7CiAgICAgICAgZHBba10gPSBueFtrXTsKICAgICAgfQogICAgfQogICAgZm9yKGk9MDtpPChOKzEpO2krKyl7CiAgICAgIGlmKGRwW2ldIDwgMTA3MzcwOTA1Nil7CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAxOTA5MTQtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBjbGFzcyBTb2x1dGlvbiB7Ci8vIHB1YmxpYzoKLy8gICBpbnQgbWFrZUFycmF5SW5jcmVhc2luZyh2ZWN0b3I8aW50PiYgQSwgdmVjdG9yPGludD4mIEIpIHsKLy8gICAgIGludCBpLCBqLCBrOwovLyAgICAgaW50IE4sIE07Ci8vICAgICBpbnQgZHBbMjAwMV0sIG54WzIwMDFdOwovLyAKLy8gICAgIE4gPSBBLnNpemUoKTsKLy8gICAgIE0gPSBCLnNpemUoKTsKLy8gICAgIHNvcnQoQi5iZWdpbigpLCBCLmVuZCgpKTsKLy8gCi8vICAgICByZXAoaSxOKzEpIGRwW2ldID0gaW50X2luZjsKLy8gICAgIGRwWzBdID0gLTE7Ci8vICAgICByZXAoaSxOKXsKLy8gICAgICAgcmVwKGssTisxKSBueFtrXSA9IGludF9pbmY7Ci8vICAgICAgIHJlcChrLE4rMSkgaWYoZHBba10gPCBBW2ldKSBueFtrXSA8Pz0gQVtpXTsKLy8gICAgICAgcmVwKGssTikgaWYoZHBba10gPCBpbnRfaW5mKSB7Ci8vICAgICAgICAgaiA9IHVwcGVyX2JvdW5kKEIuYmVnaW4oKSwgQi5lbmQoKSwgZHBba10pIC0gQi5iZWdpbigpOwovLyAgICAgICAgIGlmKGogPCBNKSBueFtrKzFdIDw/PSBCW2pdOwovLyAgICAgICB9Ci8vICAgICAgIHJlcChrLE4rMSkgZHBba10gPSBueFtrXTsKLy8gICAgIH0KLy8gCi8vICAgICByZXAoaSxOKzEpIGlmKGRwW2ldIDwgaW50X2luZikgcmV0dXJuIGk7Ci8vICAgICByZXR1cm4gLTE7Ci8vICAgfQovLyB9Owo=