Pagini recente » Cod sursa (job #1129495) | Cod sursa (job #1524635) | Cod sursa (job #333763) | Cod sursa (job #2161295) | Cod sursa (job #1739328)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAX = 100005;
int N;
int a[MAX];
int l[MAX];
int best[MAX];
int p[MAX];
int lmax, poz;
int dr;
int scmax[MAX];
int c;
void Read();
void Solve();
void Sir( int poz );
int Cauta( int nr );
int main()
{
Read();
Solve();
fin.close();
fout.close();
return 0;
}
void Read()
{
int i;
fin >> N;
for ( i = 1; i <= N; i++ )
fin >> a[i];
}
void Solve()
{
int i;
best[1] = l[1] = 1; dr = 1;
for ( i = 2; i <= N; i++ )
{
int pos = Cauta(a[i]);
best[i] = pos + 1;
l[pos + 1] = i;
p[i] = l[pos];
if ( dr < pos + 1 ) dr = pos + 1;
}
for ( i = 1; i <= N; i++ )
if ( best[i] > lmax )
{
lmax = best[i];
poz = i;
}
Sir(poz);
fout << lmax << '\n';
for ( i = 1; i <= lmax; i++ )
fout << scmax[i] << ' ';
}
void Sir( int poz )
{
if ( p[poz] > 0 )
Sir(p[poz]);
scmax[++c] = a[poz];
}
int Cauta( int nr )
{
int st = 0, mid, rez;
while ( st <= dr )
{
mid = ( st + dr ) / 2;
if ( a[l[mid]] < nr )
{
rez = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
return rez;
}