Cod sursa(job #3271288)

Utilizator happyplaneDragos Miu-Baldu happyplane Data 25 ianuarie 2025 16:53:38
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMax = 100'000;
int N, Sol;
int V[NMax + 5], Rez[NMax + 5], Prev[NMax + 5], Place[NMax + 5];

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

int BinSearch(int st, int dr, int val)
{
  int mij;

  while(st != dr)
  {
    mij = (st + dr) / 2;
    if (val <= Rez[mij])
      dr = mij;
    else
      st = mij + 1;
  }

  return st;
}

void Rezolvare()
{
  int LungMax = 1;
  Rez[1] = V[1];
  for (int i = 2;i <= N;++i)
  {
    if (V[i] > Rez[LungMax])
    {
      Rez[++LungMax] = V[i];
      Place[LungMax] = i;
      Prev[i] = Place[LungMax - 1];
    }
    else
    {
      int Poz = BinSearch(1, LungMax, V[i]);
      Rez[Poz] = V[i];
      Place[Poz] = i;
      Prev[i] = Place[Poz - 1];
    }
  }
  Sol = LungMax;
}

void Rec(int I)
{
  if (I != 0)
  {
    Rec(Prev[I]);
    fout << V[I] << " ";
  }
}

void Afisare()
{
  fout << Sol << "\n";
  Rec(Place[Sol]);
}

int main()
{
  Citire();
  Rezolvare();
  Afisare();
}