Pagini recente » Cod sursa (job #1271473) | Cod sursa (job #1000698) | Cod sursa (job #1980929) | Cod sursa (job #2045061) | Cod sursa (job #1075088)
#include <cstdio>
using namespace std;
const int MAXN = 100001;
int N, Nm;
int values[MAXN], min[MAXN], prev[MAXN], solution[MAXN];
void read() {
freopen( "scmax.in", "r", stdin );
freopen( "scmax.out", "w", stdout );
scanf("%i", &N);
for(int i = 1; i <= N; i++)
scanf("%i", &values[i]);
}
int binarySearch(int left, int right, int value) {
int m;
while( left <= right ) {
m = (left + right) >> 1;
if ( values[min[m]] < value )
left = m + 1;
else
right = m - 1;
}
return left;
}
void solve() {
int index;
for(int i = 1; i <= N; i++) {
index = binarySearch(1, Nm, values[i]);
if( index == Nm + 1 ) {
min[index] = i;
prev[i] = min[Nm];
Nm++;
} else if( values[min[index]] > values[i] ) {
if ( values[prev[min[index]]] < values[i] ) {
prev[i] = prev[min[index]];
min[index] = i;
} else if ( values[min[index - 1]] < values[i] ) {
prev[i] = min[index - 1];
min[index] = i;
}
} else
prev[i] = 0;
}
}
void printSolution() {
int index = min[Nm];
int i = Nm;
while( index ) {
solution[i--] = values[index];
index = prev[index];
}
printf("%i\n", Nm);
for(int i = 1; i <= Nm; i++)
printf("%i ", solution[i]);
}
int main() {
read();
solve();
printSolution();
return 0;
}