Cod sursa(job #2267048)

Utilizator anghelus_vladAnghelus Ionut Vlad anghelus_vlad Data 23 octombrie 2018 10:32:28
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#define NMAX 100002
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,lgmax;
int a[NMAX];
int poz[NMAX];
int best[NMAX];
int s[NMAX];
void citire();
void constrbest();
void afisare();
int cautbin(int x);
int main()
{
     citire();
     constrbest();
     afisare();
    return 0;
}
void citire()
{
  int i;
  fin>>n;
  for(i=1;i<=n;i++) fin>>a[i];
}
void constrbest()
{
 int i,pozitie;
 best[1]=a[1]; lgmax=1; poz[1]=1;
 for(i=2;i<=n;i++)
 {
     if(a[i]>best[lgmax])
     {
         best[++lgmax]=a[i];
         poz[i]=lgmax;
     }
     else
     {
        pozitie=cautbin(a[i]);
        best[pozitie]=a[i];
        poz[i]=pozitie;
     }
 }
}
void afisare()
{
 fout<<lgmax<<'\n';
 int cine,i;
 cine=lgmax;
 for(i=n;i>=1 && cine;i--)
 {
   if(poz[i]==cine)
   {
       s[cine]=a[i];
       cine--;
   }
 }
 for(i=1;i<=lgmax;i++)
    fout<<s[i]<<' ';
 fout<<'\n';
}
int cautbin(int x) /// caut binar in best cel mai mic element >= x si returnez pozitia lui
{
 int st=0, dr=lgmax+1,mijl;
 while(dr-st>1)
 {
     mijl=(st+dr)/2;
     if(best[mijl]>=x)
        dr=mijl;
     else
        st=mijl;
 }
 return dr;
}