Pagini recente » Cod sursa (job #716480) | Cod sursa (job #1673914) | Cod sursa (job #638291) | Cod sursa (job #1864472) | Cod sursa (job #2854017)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int MAXN = 1e5;
const int INF = 2e9 + 1;
ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );
int v[MAXN+1], last[MAXN+1], prevInd[MAXN+1];
int sol[MAXN+1];
int main() {
int n, i, st, dr, length, mij, k;
fin >> n;
for( i = 0; i < n; i++ )
fin >> v[i];
for( i = 0; i < n; i++ )
prevInd[i] = -1;
length = 1;
for( i = 1; i < n; i++ ) {
if( v[i] < v[last[0]] )
last[0] = i;
else if( v[i] > v[last[length-1]] ) {
prevInd[i] = last[length-1];
last[length++] = i;
}
else {
st = 0;
dr = length;
while( dr - st > 1 ) {
mij = ( st + dr ) / 2;
if( v[last[mij]] > v[i] )
dr = mij;
else
st = mij;
}
if( v[last[st]] < v[i] )
st++;
if( v[last[st]] != v[i] ) {
prevInd[i] = last[st-1];
last[st] = i;
}
}
}
fout << length << "\n";
k = 0;
for( i = last[length-1]; i >= 0; i = prevInd[i] )
sol[k++] = v[i];
k--;
while( k >= 0 ) {
fout << sol[k] << " ";
k--;
}
return 0;
}