Cod sursa(job #1390924)

Utilizator gabib97Gabriel Boroghina gabib97 Data 17 martie 2015 14:06:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>
#include <stdlib.h>
#define inf 1000000
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int n,i,a[1000001],o[1000001],u,p[1000001],j,x;
int caut(int v,int x,int y)
{
    int m=(x+y)/2;
    if (x==y) return x;
    else if (v>o[m]) return caut(v,m+1,y);
    return caut(v,x,m);
}
int cbp(int v)
{
    int step,i;
    for (step=1;step<=u;step<<=1);
    for (i=0;step;step>>=1)
        if (i+step<=u&&o[i+step]<=v)
            i+=step;
    return i;
}
void afis(int n,int u)
{
    if (u)
    {
        int i;
        for (i=n;p[i]!=u;i--);
        afis(i-1,u-1);
        fout<<a[i]<<" ";
    }
}
int main()
{
    fin>>n;
    //for (i=1;i<=1000000;i++) fin<<rand()%1000<<'\n';
    for (i=1;i<=n;i++) fin>>a[i];
    u=1; o[1]=a[1]; p[1]=1;
    o[2]=inf;
    for (i=2;i<=n;i++)
    {
        x=caut(a[i],1,u+1);
        o[x]=a[i];
        p[i]=x;
        if (x==u+1) o[++u+1]=inf;
    }
    fout<<u<<'\n';
    afis(n,u);
    return 0;
}