Pagini recente » Cod sursa (job #1333543) | Cod sursa (job #835918) | Cod sursa (job #1687035) | Cod sursa (job #16567) | Cod sursa (job #2173879)
#include <fstream>
#include <vector>
#include <algorithm>
#define val first
#define indice second
using namespace std;
int n,i,j,v[100005],ta[100005],poz;
pair < int, int > aranj[ 100005 ];
vector < int > mv;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int cautareb( int st, int dr )
{
int mij = ( st + dr ) / 2;
if( st <= dr )
{
if( aranj[ mij ].val < v[ i ] )
return cautareb( mij + 1, dr );
else
return cautareb( st , mij - 1 );
}
return mij;
}
int main()
{
fin>>n;
for( i = 1; i <= n; i++ )
fin>>v[ i ];
aranj[ 1 ].val = v[ 1 ];
aranj[ 1 ].indice = 1;
ta[ 1 ] = 0;
int lmax = 1;
for( i = 2 ; i <= n; i++ )
{
poz = cautareb( 1 , lmax );
if( poz == lmax )
{
lmax++;
}
aranj[ poz + 1 ].val = v[ i ];
aranj[ poz + 1 ].indice = i;
ta[ i ] = aranj[ poz ].indice;
}
fout<<lmax<<'\n';
i = aranj[ lmax ].indice;
while( i != 0 )
{
mv.push_back( v[ i ] );
i = ta[ i ];
}
reverse( mv.begin( ), mv.end( ) );
for( auto itmv : mv )
fout<<itmv<<" ";
return 0;
}