Cod sursa(job #2967540)

Utilizator 222cezarCezar Stilpeanu 222cezar Data 19 ianuarie 2023 18:59:53
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
using namespace std;

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

int n, x[100001], lung[100001], val_min[200002];
int cb(int v[], int sz, int val)
{
  int st = 1, dr = sz, rez = 0;
  while(st <= dr)
  {
    int m = (st + dr) / 2;
    if(v[m] < val)
    {
      rez = m;
      st = m + 1;
    }
    else
    {
      dr = m -1;
    }
  }
  return rez;
}

void refac_subsirul(int p, int val, int l)
{
  if(l == 1)
  {
    return;
  }
  if(x[p] < val && lung[p] == l - 1)
  {
    refac_subsirul(p - 1, x[p], lung[p]);
    cout << x[p] << " ";
  }
  else
  {
    refac_subsirul(p - 1, val, l);
  }
}

int main()
{
  cin >> n;
  int n_val_min = 0, pmax = 1;
  for(int i = 1; i <= n; i++)
  {
    cin >> x[i];
    int j0 = cb(val_min, n_val_min, x[i]);
    if(j0 == n_val_min)
    {
      n_val_min++;
    }
    lung[i] = 1 + j0;
    val_min[lung[i]] = x[i];
    if(lung[i] > lung[pmax])
    {
      pmax = i;
    }
  }
  cin.close();

  cout << lung[pmax] << '\n';
  refac_subsirul(pmax, x[pmax] + 1, lung[pmax] + 1);
  cout.close();
}