Pagini recente » Cod sursa (job #1126045) | Cod sursa (job #1137747) | Cod sursa (job #376249) | Cod sursa (job #2452851) | Cod sursa (job #1523670)
#include <iostream>
#include <cstdio>
using namespace std;
int a[100010],t[100010],l[100010],val[100010],indice[100010],m,n,k,v[100010],j=0;
FILE *f=fopen("scmax.in","r");
FILE *f1=fopen("scmax.out","w");
int caut_binar(int s, int d,int nr)
{
if(s>d)
return m;
else
{
m =(s+d)/2;
if(nr<val[m]&&nr>val[m-1])
return m;
if(nr<val[m-1])
return caut_binar(s,m-1,nr);
return caut_binar(m+1,d,nr);
}
}
void scmax(int a[100010],int n)
{
val[1]=a[1];
l[1]=1;
indice[1]=1;
k=1;
int nr;
for(int i=2; i<=n; i++)
{
nr=a[i];
if(nr>val[k])
{
val[++k]=nr;
l[k]=l[k-1]+1;
indice[k]=i;
t[i]=indice[k-1];
}
else
{
int c=caut_binar(1,k,nr);
val[c]=nr;
indice[c]=i;
t[i]=indice[k-1];
}
}
}
void restoration( )
{
int i=indice[k];
while(i)
{
v[++j]=a[i];
i=t[i];
}
for(i=j; i>=1; i--)
fprintf(f1,"%d ",v[i]);
}
int main()
{
int n,i;
fscanf(f,"%d",&n);
for(i=1; i<=n; i++)
{
fscanf(f,"%d",&a[i]);
}
scmax(a,n);
fprintf(f1,"%d\n",l[k]);
//restoration( );
return 0;
}