Pagini recente » Cod sursa (job #1339248) | Cod sursa (job #2959307) | Cod sursa (job #866408) | Cod sursa (job #1132834) | Cod sursa (job #1314572)
#include <stdio.h>
using namespace std;
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
int A[100005],p[100005],l[100005],best[100005],n,nr,i,poz,mx;
void drum (int i)
{
if (p[i]>0)drum(p[i]);
fprintf(g,"%d ",A[i]);
}
int caut (int x)
{
int p,u,m,r;
p=0;u=nr;m=(p+u)/2;
while(p<=u)
{
if (x<=A[l[m]]){u=m-1;m=(p+u)/2;}
else if (x>A[l[m]]){r=m;p=m+1;m=(p+u)/2;}
}
return r;
}
int main()
{
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)fscanf(f,"%d",&A[i]);
l[0]=0;
l[1]=1;
best[1]=1;
nr=1;
for(i=2;i<=n;i++)
{
poz=caut(A[i]);
p[i]=l[poz];
//sau best[poz]
best[i]=poz+1;
l[poz+1]=i;
if (nr<poz+1)nr=poz+1;
}
mx=0;
for(i=1;i<=n;i++)
if (mx<best[i]){mx=best[i];poz=i;}
fprintf(g,"%d\n",mx);
drum(poz);
fclose(g);
return 0;
}