Cod sursa(job #326244)

Utilizator IoannaPandele Ioana Ioanna Data 24 iunie 2009 13:28:39
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
long n;
long v[100010],q[100010],p[100010];


void read()
{
scanf("%ld",&n);
long i;
for (i=1;i<=n;i++)
    {
     scanf("%ld",&v[i]);
    }
}

long cautbin(long st,long dr,long x)
{
long m,p;
p=0;
while (st<=dr)
      {
       m=(st+dr)/2;
       if (q[m]>=x)
          {
           p=m;
           dr=m-1;
          }
       else {st=m+1;}
      }
return p;
}

void rez()
{
long i;
q[0]=1;
q[1]=v[1];
p[1]=1;
p[0]=1;
long k;
for (i=2;i<=n;i++)
    {
     k=cautbin(1,q[0],v[i]);
     if (k==0)
        {
         q[++q[0]]=v[i];
         p[++p[0]]=q[0];
        }
    else {
          q[k]=v[i];
          p[++p[0]]=k;
         }
    }
printf("%ld\n",q[0]);
}

void sol(long k,long x)
{
if (x==0)
    return;
long i;
for (i=k;i>=1;i--)
    if (p[i]==x)
        break;
sol(i,x-1);
printf("%ld ",v[i]);
}

int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
read();
rez();
long i;
sol(p[0],q[0]);
return 0;
}