Cod sursa(job #2689740)

Utilizator Asgari_ArminArmin Asgari Asgari_Armin Data 22 decembrie 2020 00:08:37
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5;
const int INF = 2e9 + 2;
int v[NMAX + 1], dp[NMAX + 1];
int p[NMAX + 1], a[NMAX + 1];

int main() {
  int n, i, lung, j;
  fin >> n;
  for( i = 1; i <= n; ++i )
    fin >> v[i];
  for( i = 0; i <= NMAX; ++i )
    dp[i] = INF;
  dp[1] = v[1];
  p[1] = 1;
  lung = 1;
  for( i = 1; i <= n; ++i ){
    int st, dr, med;
    st = 0; dr = NMAX;
    while( dr - st > 1 ){
      med = (st + dr) >> 1;
      if( dp[med] < v[i] )
        st = med;
      else
        dr = med;
    }
    if( dp[dr] == INF ){
      dp[++lung] = v[i];
      p[i] = lung;
    }
    else{
      dp[dr] = v[i];
      p[i] = dr;
    }
  }
  fout << lung << "\n";
	for ( j = n, i = lung; i >= 1; i--) {
		while (p[j] != i) j--;
		a[i] = v[j];
	}
	for ( i = 1; i <= lung; i++)
    fout << a[i] << " ";
  return 0;
}