Pagini recente » Cod sursa (job #1019745) | Cod sursa (job #1197705) | Cod sursa (job #2628874) | Cod sursa (job #372604) | Cod sursa (job #617438)
Cod sursa(job #617438)
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;
#define LL long long
#define INFILE "scmax.in"
#define OUTFILE "scmax.out"
//#define AMAX 2000000000
#define NMAX 100001
int N;
int mina[NMAX], a[NMAX], prev[NMAX];
bool viz[NMAX];
int best = -1;
void add(int lv, int rv, int val)
{
if( lv==rv )
{
if( lv>0 ) prev[val] = mina[lv-1];
if( viz[lv]==0 || a[mina[lv]]>a[val] )
{
mina[lv] = val;
viz[lv] = 1;
if( lv>best ) best = lv;
}
return;
}
int mid = (lv+rv) / 2;
if( viz[mid]==1 && a[val] > a[mina[mid]] )
add(mid+1, rv, val);
else
add(lv, mid, val);
}
void printarray(int val, int i)
{
if( i>=0 )
{
printarray(prev[val], i-1);
printf("%d", a[val]);
if( i<best ) printf(" ");
}
}
int main()
{
memset(viz, 0, sizeof(viz));
freopen(INFILE, "r", stdin);
freopen(OUTFILE, "w", stdout);
scanf("%d", &N);
for(int i=0; i<N; i++)
{
scanf("%d", &a[i]);
add(0, N, i);
}
printf("%d\n", best+1);
printarray(mina[best], best);
return 0;
}