Cod sursa(job #2696089)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 15 ianuarie 2021 12:23:03
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

const int POW = 16;
const int MAXN = 100000;

int v[MAXN], p[MAXN], ind[MAXN];

int coutare_binara( int nr, int left, int right ){
  int i, step;
  i = left - 1;
  step = 1 << POW;
  while( step != 0 ){
    if( i + step <= right && v[ ind[ i + step ] ] < nr )
      i = i + step;
    step = step >> 1;
  }
  return i;
}

void afisare( int pozitie ){
  if( pozitie != -1 ){
    afisare( p[pozitie] );
    //cout<<p[pozitie]<<'\n';
    out<<v[pozitie]<<" ";
  }
}

int main()
{
    int n, i, lung, max_lung;
    in>>n;
    for( i = 0; i < n; i++ )
      in>>v[i];

    max_lung = 0;
    for( i = 0; i < n; i++ ){
      lung = coutare_binara( v[i], 0, max_lung - 1 ) + 1;
      ind[lung] = i;

      if( lung > 0 )
        p[i] = ind[ lung - 1 ];
      else
        p[i] = -1;
      max_lung = max( lung + 1, max_lung );
    }
    out<<max_lung<<'\n';
    afisare( ind[ max_lung - 1 ] );
    return 0;
}