Cod sursa(job #2267064)

Utilizator Iancu_StefanIancu Stefan Iancu_Stefan Data 23 octombrie 2018 10:34:36
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#define NMAX 100100

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

int a[NMAX],poz[NMAX],best[NMAX],s[NMAX];
int n,lgmax;
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;
     }

}
int cautbin(int x)
//caut binar in best cel mai mic element >=x si returnez pozitia lui
{
 int st=0,dr=lgmax+1,mijloc;
 while (dr-st>1)
      {
       mijloc=(st+dr)/2;
       if (best[mijloc]>=x)
          dr=mijloc;
       else st=mijloc;
      }
 return dr;
}
void afisare()
{
 int i,cine;
 fout<<lgmax<<'\n';
 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';
}