Cod sursa(job #2267053)

Utilizator corina_dimitriuDimitriu Corina corina_dimitriu Data 23 octombrie 2018 10:33:11
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define DMAX 100002

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,lgmax;
int a[DMAX];
int poz[DMAX];
int best[DMAX],sol[DMAX];
void citire();
void contrbest();
void afisare();
int cautbinar(int x);
int main()
{
    citire();
    contrbest();
    afisare();
    return 0;
}
void citire()
{int i;
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>a[i];
}
void contrbest()
{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=cautbinar(a[i]);
            best[pozitie]=a[i];
            poz[i]=pozitie;
           }
    }
}
void afisare()
{int cine=lgmax,i;
    fout<<lgmax<<'\n';
    for(i=n;i>=1&&cine;i--)
    {
        if(poz[i]==cine)
         {
           sol[cine]=a[i];
           cine--;
         }
    }
    for(i=1;i<=lgmax;i++)
        fout<<sol[i]<<' ';
    fout<<'\n';
}
int cautbinar(int x)
{//caut binar in best cel mai mic element>x
 //si returnez pozitia lui
  int st=0,dr=lgmax+1,mij;
  while(dr-st>1)
      {
       mij=(st+dr)/2;
       if(best[mij]>=x)
          dr=mij;
          else st=mij;
      }
  return dr;
}