Cod sursa(job #2375366)

Utilizator dragossofiaSofia Dragos dragossofia Data 8 martie 2019 08:31:46
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>
#define INF (1<<30)
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int lg[100001],pre[100001],aux[100001];
int a[100001],n;
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 0;

  int mid = ( lf + rg ) / 2;

  if( val > a[ aux[mid] ] ) return max( mid, BinSearch( mid + 1, rg, val ) );
  else return BinSearch( lf, mid - 1, val );
}

void Remake( int idx )
{
  if( pre[idx] > 0 ) Remake( pre[idx] );

  fout << a[idx] << ' ';
}
void Do()
{
 a[0] = -INF;
 a[n + 1] = INF;

  aux[0] = 0;
int  last = 0,poz;

 for(int i=1;i<=n;i++)
    {
     if(a[i] >a[aux[last]])
        {aux[ ++ last ] =i;
         pre[i] = aux[last - 1];
        }
     else
        {
         poz = BinSearch(1 , last , a[i]);
         pre[i] = aux[poz] ;
         aux[poz + 1] = i;
        }
    }
 //or(int i = 1 ; i <=  poz ; i ++ )
    //cout<<aux[i]<<" ";
 fout<<last<<"\n";
 Remake(aux[last]);


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