Pagini recente » Cod sursa (job #418981) | Cod sursa (job #2324085) | Cod sursa (job #1189706) | Cod sursa (job #2519247) | Cod sursa (job #749529)
Cod sursa(job #749529)
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int MAXN = 100005;
int N;
int A[MAXN], B[MAXN], best[MAXN], tata[MAXN], L;
void solve()
{
B[ L = 0 ] = 0;
int pow = 1, i, now, step;
for(i = 1; i <= N; ++i){
while((pow << 1) <= L) pow <<= 1;
now = 0;
for(step = pow; step; step >>=1){
if((now + step <= L) && A[ B[now + step] ] < A[i])
now += step;
best[i] = best[ B[now] ] + 1;
tata[i] = B[now];
if(now == L)
B[ ++L ] = i;
else
if(A[ B[now + 1] ] > A[i])
B[now + 1] = i;
}
}
}
void scrie(int i)
{
if( !i ) return;
scrie(tata[i]);
out << A[i] << " ";
}
int main()
{
int i, j;
in >> N;
for(i = 1; i <= N; ++i)
in >> A[i];
solve();
out << L << "\n";
for(i = 1; i <= N; ++i)
if(best[i] == L){
scrie(i);
return 0;
}
return 0;
}