Pagini recente » Cod sursa (job #2965550) | Cod sursa (job #702779) | Cod sursa (job #330974) | Cod sursa (job #726671) | Cod sursa (job #750039)
Cod sursa(job #750039)
#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], parent[MAXN], L;
void solve()
{
B[ L = 0 ] = 0;
int pow = 1, i, now, step;
for(i = 1; i <= N; i++)
{
while((pow << 1) <= L) pot <<= 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;
parent[i] = B[now];
if(now == L)
B[++L] = i;
else
if(A[B[now+1]] > A[i])
B[now+1] = i;
}
}
void write(int i)
{
if(!i) return;
write(parent[i]);
out<<A[i]<<" ";
}
int main()
{
int i;
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)
{
write(i);
return 0;
}
return 0;
}