Cod sursa(job #1604133)

Utilizator dorin31Geman Dorin Andrei dorin31 Data 17 februarie 2016 23:33:29
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>

#define dim 100001

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int v[dim],sc[dim],urm[dim];
int n,len;

void teachmemasterpls()
{
    for (int k=1; k<=n; ++k) fout<<urm[k]<<" ";
    fout<<'\n';
    for (int k=1; k<=n; ++k) fout<<sc[k]<<" ";
    fout<<"\n\n";
}

void readV()
{
    fin>>n;
    for (int i=1; i<=n; ++i)
        fin>>v[i];
}

void print(int x)
{
    if (urm[x]) print(urm[x]);
    fout<<v[x]<<" ";
}

inline int binarySearch(int x)
{
    int i,j;
    for (j=1; j<len; j<<=1);
    for (i=0; j; j>>=1)
        if (i+j<=len && v[sc[i+j]]<x) i+=j;
    return i;
}

void pd()
{
    sc[1]=1;
    len=1;
    for (int i=2; i<=n; ++i)
    {
        int x=v[i];
        int poz=binarySearch(x); //fout<<poz<<'\n';
        if (poz==len) sc[++len]=i;
        else if (v[sc[poz+1]]>x) sc[poz+1]=i;
        urm[i]=sc[poz];

        //teachmemasterpls();

    }
    fout<<len<<'\n';
    print(sc[len]);
}

int main()
{
    readV();
    pd();
    return 0;
}