Pagini recente » Cod sursa (job #1182427) | Cod sursa (job #46660) | Cod sursa (job #360626) | Cod sursa (job #2853707) | Cod sursa (job #972311)
Cod sursa(job #972311)
#include <fstream>
#define NMax 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int N, X[NMax], DP[NMax], Succ[NMax], L[NMax], K, Max, PMax;
void Read()
{
fin>>N;
for(int i=1;i<=N;i++)
fin>>X[i];
}
int cautbin(int val)
{
int s=1,d=K,Sol=0;
while(s<=d)
{
int mid=(s+d)/2;
if(X[L[mid]]>val)
{
Sol=mid;
s=mid+1;
}
else
d=mid-1;
}
return Sol;
}
void Solve()
{
int i,j;
DP[N]=1;K=1;L[1]=N;
for(i=N-1;i>=1;i--)
{
j=cautbin(X[i]);
DP[i]=DP[L[j]]+1;
Succ[i]=L[j];
L[j+1]=i;
if(j==K)
K++;
}
for(i=1;i<=N;i++)
{
if(DP[i]>Max)
{
Max=DP[i];
PMax=i;
}
}
}
void Print()
{
int i=PMax;
fout<<Max<<"\n";
while(i)
{
fout<<X[i]<<" ";
i=Succ[i];
}
}
int main()
{
Read();
Solve();
Print();
return 0;
}