Pagini recente » Cod sursa (job #228511) | Cod sursa (job #2196708) | Cod sursa (job #2586569) | Cod sursa (job #1655939) | Cod sursa (job #1089074)
#include <fstream>
#include<stack>
#define NMAX 100003
using namespace std;
FILE* f=freopen("scmax.in","r",stdin);
FILE* o=freopen("scmax.out","w",stdout);
int n,a[NMAX];
int best[NMAX],poz[NMAX],lb;
stack<int> output;
int Bs(int x)
{
int i=1,j=lb+1,mij,p=-1;
while(i<j)
{
mij=(i+j)/2;
if(best[mij]>=x)
{
p=mij;
j=mij-1;
}
else
{
i=mij+1;
}
}
return p;
}
int Insert(int x)
{
if(best[lb]<x)
{
best[++lb]=x;
return lb;
}
else
{
int p=Bs(x);
best[p]=x;
return p;
}
return -1;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&a[i]);
poz[i]=Insert(a[i]);
}
printf("%d\n",lb);
int p=lb;
for(int i=n-1;i>=0;--i)
{
if(poz[i]==p)
{
output.push(a[i]);
p-=1;
}
}
while(!output.empty())
{
printf("%d ",output.top());
output.pop();
}
return 0;
}