Cod sursa(job #2267047)

Utilizator ApetriiRaduApetrii Radu ApetriiRadu Data 23 octombrie 2018 10:32:24
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
#define NMAX 100010
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int a[NMAX];
int poz[NMAX];
int best[NMAX];
int sol[NMAX];
int n,lgmax;

void citire();
void pd();
void afisare();
int cb(int x);
int main()
{citire();
 pd();
 afisare();
 return 0;
}
void citire()
{int i;
 fin>>n;
 for(i=1;i<=n;i++)
     fin>>a[i];
}
void pd()
{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=cb(a[i]);
          best[pozitie]=a[i];
          poz[i]=pozitie;
         }
}
void afisare()
{int i,cine;
 fout<<lgmax<<'\n';
 cine=lgmax;
 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 cb(int x) //cautarea binara a celui mai mic element >= x
{int st=0,dr=lgmax+1,mijloc; //best[st]<=best[dr]
 while(dr-st>1)
      {mijloc=(st+dr)/2;
       if(best[mijloc]>=x)
         dr=mijloc;
         else
            st=mijloc;
      }
 return dr;
}