Cod sursa(job #2562086)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 29 februarie 2020 12:07:20
Problema Subsir 2 Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 5005;

int N;
int a[NMAX];
int lis[NMAX], last;
int lisp[NMAX];

void Read()
{
    fin >> N;
    for( int i = 1; i <= N; ++i )
      fin >> a[i];
}

int BinSearch( int lf, int rg, int val ) {
    if( lf > rg ) return -1;

    int mid = lf + ( rg - lf ) / 2;

    if( lis[mid] <= val ) return max( mid, BinSearch( mid + 1, rg, val ) );
    else return BinSearch( lf, mid - 1, val );
}

void Do()
{
    lis[++last] = a[1];
    lisp[1] = 1;

    for( int i = 2; i <= N; ++i ) {
       if( a[i] < lis[1] ) { lis[1] = a[i]; lisp[1] = i; }
       else {
         int p = BinSearch( 1, last, a[i] );

         lis[p + 1] = a[i];
         lisp[p + 1] = i;
         if( p + 1 > last ) last++;
       }
    }

    /*for( int i = 1; i <= last; ++i )
      fout << lis[i] << ' '; fout << '\n';*/

    fout << last << '\n';
    for( int i = 1; i <= last; ++i )
       fout << lisp[i] << ' ';
}

int main()
{
    Read();
    Do();

    return 0;
}