Pagini recente » Cod sursa (job #2687120) | Cod sursa (job #524119) | Cod sursa (job #1186164) | Cod sursa (job #219892) | Cod sursa (job #1372234)
#include <cstdio>
using namespace std;
const int N=100005;
int v[N],pred[N],l[N],best=0,sol[N];
void caut(int i)
{
int pas=1<<18,p=0;;
while(pas>N)
pas=pas/2;
while(pas>=1)
{
if(p+pas<N-2 && l[p+pas]!=0 && v[l[p+pas]]<=v[i])
{
p=p+pas;
}
pas=pas/2;
}
if(v[i]<=v[l[p]])
{
l[p]=i;
pred[i]=l[p-1];
}
else
{
p++;
l[p]=i;
pred[i]=l[p-1];
}
if(best<p)
best=p;
}
int main()
{
FILE *in,*out;
in=fopen("scmax.in","r");
out=fopen("scmax.out","w");
int n,i,p;
fscanf(in,"%d",&n);
for(i=1;i<=n;i++)
fscanf(in,"%d",&v[i]);
for(i=1;i<=n;i++)
caut(i);
fprintf(out,"%d\n",best);
p=l[best];
for(i=1;p!=0;i++)
{
sol[i]=v[p];
p=pred[p];
}
for(i=best;i>=1;i--)
fprintf(out,"%d ",sol[i]);
return 0;
}