Cod sursa(job #260133)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 16 februarie 2009 17:56:34
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#define NMAX 100001

using namespace std;

int n,lmax,k,sol[NMAX],m,poz;
int sir[NMAX],length[NMAX],t[NMAX];

int search(int x)
{
   int pr=0,ul=m,mij;
   mij=(pr+ul)/2;
   while(pr<=ul)
   {
        if(sir[length[mij]]<x && sir[length[mij+1]]>=x)
            return mij;
        else if (sir[length[mij+1]]<x)
        {
            pr=mij+1;
            mij=(pr+ul)/2;
        }
        else
        {
            ul=mij-1;
            mij=(pr+ul)/2;
        }
   }
   return m;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    m=1;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&sir[i]);
    length[0]=0;
    sol[1]=length[1]=1;
    for(int i=2;i<=n;i++)
    {
        poz=search(sir[i]);
        t[i]=length[poz];
        sol[i]=poz+1;
        length[poz+1]=i;
        if(m<poz+1)
            m=poz+1;
    }
    lmax=poz=0;
    for(int i=1;i<=n;i++)
        if(lmax<sol[i])
        {
            lmax=sol[i];
            poz=i;
        }
    printf("%d\n",lmax);
    for(int i=1;i<=lmax;i++)
        printf("%d\n",sol[i]);
    fclose(stdout);
    return 0;
}