Pagini recente » Cod sursa (job #2259811) | Cod sursa (job #850458) | Cod sursa (job #338687) | Cod sursa (job #1141823) | Cod sursa (job #175179)
Cod sursa(job #175179)
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <bitset>
#include <list>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;
#define ALL(x) (x).begin(), (x).end()
#define FOR(i, a, b) for(int i = (int)(a); i < (int)(b); ++i)
#define FORI(it, v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)
#define pb push_back
#define mp make_pair
#define MAXN 100005
int N, x[MAXN];
vector<int> val;
int aib[MAXN], bst[MAXN], p[MAXN];
inline int aibQuery( int poz )
{
int rez = 0;
for (; poz; poz &= (poz - 1))
rez = max( rez, aib[poz] );
return rez;
}
inline void aibUpdate( int poz, int val )
{
for (; poz < MAXN; poz += (poz ^ (poz - 1)) & poz)
aib[poz] = max( aib[poz], val );
}
int main()
{
freopen("scmax.in", "rt", stdin);
freopen("scmax.out", "wt", stdout);
scanf("%d", &N);
FOR(i, 0, N)
scanf("%d", x + i),
val.pb( x[i] );
sort( ALL(val) );
val.resize( unique( ALL(val) ) - val.begin() );
FOR(i, 0, N)
x[i] = lower_bound( ALL(val), x[i] ) - val.begin() + 1;
memset( aib, 0, sizeof(aib) );
int Max = -1, MaxP = -1;
FOR(i, 0, N)
{
bst[i] = aibQuery(x[i] - 1) + 1;
aibUpdate( x[i], bst[i] );
if (bst[i] > Max)
Max = bst[i],
MaxP = i;
}
printf("%d\n", Max);
vector<int> sol;
int poz = MaxP;
for (; poz; )
{
sol.pb( val[ x[poz] - 1 ] );
int k;
for (k = poz - 1; k; k--)
{
if ( x[k] < x[poz] && bst[k] == bst[poz] - 1 )
break;
}
poz = k;
}
reverse( ALL(sol) );
FORI(it, sol)
printf("%d ", *it);
printf("\n");
return 0;
}