Cod sursa(job #710208)

Utilizator voicuraduVoicu Radu voicuradu Data 9 martie 2012 11:24:39
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<cstdio>
using namespace std;
int n,nr;
int v[100010],x[100010],pred[100010];
void read()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    int i;
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
}

int cautbin(int val)
{
    int i,pas=1<<16;
    for(i=0;pas;pas/=2)
        if(i+pas<=nr && v[x[i+pas]]<val)
            i+=pas;
    return i+1;
}

void refac(int p)
{
    if(pred[p])
        refac(pred[p]);
    printf("%d ",v[p]);
}

void rez()
{
    int i,j;
    x[++nr]=1;
    pred[1]=0;
    for(i=2;i<=n;i++)
    {
        j=cautbin(v[i]);
        x[j]=i;
        pred[i]=x[j-1];
        if(j>nr)
            nr++;
    }
    printf("%d\n",nr);
   /* for(i=1;i<=n;i++)
        printf("%d ",pred[i]);
    printf("\n");

    for(i=1;i<=nr;i++)
        printf("%d ",x[i]);
    printf("\n");
    */
    refac(x[nr]);
    printf("\n");
}

int main()
{
    read();
    rez();
    return 0;
}