Cod sursa(job #1612109)

Utilizator alexmanoAlex Manolache alexmano Data 24 februarie 2016 18:26:48
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int v[100001],      sol[100001], N, L = 0;
int                 indici[100001];
int link[100001];

int afisare[100001];

int compare(int i)
{
    int y = 0;
    /*for (int j = 1; j <= L; j++)
        if (sol[j] < v[i])
            y = j;*/
    int pas=1<<30;
    while(pas){
        if(y+pas <= L  &&  sol[y+pas] < v[i]) y+=pas; //y|=pas;
        pas>>=1;
    }

    return y+1;
}

int main()
{
    in >> N;

    for (int i = 1; i <= N; i++)
        in >> v[i];

    for (int i = 1; i <= N; i++){
        int unde = compare(i);
        if(unde > L) L++;

        sol[unde]=v[i];
        indici[unde]=i;

        link[i]=indici[unde-1];
    }
    out<<L<<'\n';
    int poz=indici[L];
    for(int i=L;i>=1;i--){
        afisare[i] = v[poz];
        poz=link[poz];
    }


    for(int i=1;i<=L;i++) out<<afisare[i]<<' ';
    out<<'\n';
    return 0;
}