Pagini recente » Cod sursa (job #2099166) | Cod sursa (job #1274512) | Cod sursa (job #2053752) | Cod sursa (job #1777753) | Cod sursa (job #903480)
Cod sursa(job #903480)
#include<cstdio>
#define NMAX 100005
using namespace std;
int a[NMAX],DP[NMAX],ant[NMAX],n,l;
void read()
{
FILE *fin=fopen("scmax.in","r");
fscanf(fin,"%d",&n);
for(int i=1;i<=n;i++)
fscanf(fin,"%d",&a[i]);
fclose(fin);
}
void solve()
{
int i,j,s,d,mid;
DP[l=1]=1;
for(i=2;i<=n;i++)
{
if(a[i]>a[DP[l]])
{
ant[i]=DP[l];
DP[++l]=i;
continue;
}
s=1;
d=l;
mid=(s+d)/2;
while(s<d)
{
if(a[DP[mid]]<a[i])
s=mid+1;
else
d=mid;
mid=(s+d)/2;
}
if(a[DP[mid]]>a[i])
{
DP[mid]=i;
ant[i]=DP[mid-1];
}
}
for(i=DP[l],j=l;i;i=ant[i],j--)
DP[j]=a[i];
}
void print()
{
FILE *fout=fopen("scmax.out","w");
fprintf(fout,"%d\n",l);
for(int i=1;i<=l;i++)
fprintf(fout,"%d ",DP[i]);
fclose(fout);
}
int main()
{
read();
solve();
print();
return 0;
}