Cod sursa(job #721523)
#include <fstream>
using namespace std;
#define nmax 100001
ifstream f ("scmax.in");
ofstream g ("scmax.out");
int best[nmax],poz[nmax],a[nmax],l[nmax],n,max;
int cauta(int i)
{
int x=0,j;
for(j=1;j<i;j++)
if(x<best[j] && a[j]<a[i]) x=j;
return x;
}
void dinamic()
{
int i;
best[0]=0;
for(i=1;i<n;i++)
{
int p;
p=cauta(i);
best[i]=best[p]+1;
poz[i]=p;
}
}
void afisare2(int p, int max)
{
if(max>0) {afisare2(poz[p],max-1);}
g<<a[p]<<" ";
}
void afisare()
{
g<<best[n-1]<<"\n";
int max=0,p=0,i;
for(i=0;i<n;i++)
{
if(max<best[i]) max=best[i],p=i;
}
afisare2(p,max-1);
g.close();
}
int main()
{
int i;
f>>n;
for(i=0;i<n;i++) f>>a[i];
f.close();
dinamic();
afisare();
return 0;
}