Pagini recente » Cod sursa (job #3255965) | Cod sursa (job #1305866) | Cod sursa (job #278894) | Monitorul de evaluare | Cod sursa (job #2949192)
#include <cstdio>
using namespace std;
const int NMAX=100005;
int v[NMAX],lis=1,ant[NMAX],temp[NMAX],poz[NMAX],rez[NMAX];
int caut_bin(int st,int dr,int x)
{
int med,ans;
while(st<=dr)
{
med=(st+dr)/2;
if(temp[med]>=x)
{
ans=med;
dr=med-1;
}
else
st=med+1;
}
return ans;
}
void LIS(int v[],int n)
{
int i,ind;
temp[1]=v[1];
poz[1]=1;
ant[1]=0;
for(i=2;i<=n;i++)
{
if(v[i]>temp[lis])
{
temp[++lis]=v[i];
poz[lis]=i;
ant[i]=poz[lis-1];
}
else
{
ind=caut_bin(1,lis,v[i]);
temp[ind]=v[i];
poz[ind]=i;
ant[i]=poz[ind-1];
}
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,i,ppoz;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
LIS(v,n);
printf("%d",lis);
printf("\n");
ppoz=poz[lis];
while(ppoz)
{
rez[++rez[0]]=v[ppoz];
ppoz=ant[ppoz];
}
for(i=lis;i>=1;i--)
printf("%d ",rez[i]);
fclose(stdin);
fclose(stdout);
return 0;
}