Pagini recente » Cod sursa (job #2405651) | Cod sursa (job #3236008) | Cod sursa (job #1257711) | Cod sursa (job #2205493) | Cod sursa (job #300244)
Cod sursa(job #300244)
#include<cstdio>
using namespace std;
#define INPUT "scmax.in"
#define OUTPUT "scmax.out"
const long NMAX = 100001;
FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");
long N, poz;
long V[ NMAX ], Best[ NMAX ], Loc[ NMAX ], Poz[ NMAX ];
void readData()
{
fscanf(fin, "%ld", &N);
for(long i = 1; i <= N; ++i)
fscanf(fin, "%ld", &V[ i ]);
Best[ 1 ] = 1;
Loc[ 1 ] = 1;
Loc[ 0 ] = 0;
}
long binSrch(long Left, long Right, long Val)
{
long mid = (Left + Right) >> 1;
while(Left <= Right)
{
if(V[ Loc[ mid ] ] < Val && V[ Loc[ mid+1 ] ] >= Val) return mid;
else
if(V[ Loc[ mid+1 ] ] < Val) Left = mid + 1, mid = (Left + Right) >> 1;
else
Right = mid - 1, mid = (Left + Right) >> 1;
}
return poz;
}
void afis(long X)
{
if(Poz[ X ] > 0) afis(Poz[ X ]);
fprintf(fout, "%ld ", V[ X ]);
}
void solve()
{
long nPoz;
poz = 1;
for(long i = 2; i <= N; ++i)
{
nPoz = binSrch(0, poz, V[ i ]);
Poz[ i ] = Loc[ nPoz ];
Best[ i ] = nPoz + 1;
Loc[ nPoz + 1 ] = i;
if(poz < nPoz + 1) poz = nPoz + 1;
}
long max = -1;
poz = -1;
for(long i = 1; i <= N; ++i)
if(max < Best[ i ]) max = Best[ i ], poz = i;
fprintf(fout, "%ld\n", max);
afis(poz);
}
int main()
{
readData();
solve();
fclose(fin);
fclose(fout);
return 0;
}