Pagini recente » Cod sursa (job #2429004) | Cod sursa (job #2686215) | Cod sursa (job #1451961) | Cod sursa (job #441155) | Cod sursa (job #1339027)
#include <fstream>
#define IN "scmax.in"
#define OUT "scmax.out"
#define DMAX 100005
using namespace std;
ifstream fin (IN);
ofstream fout (OUT);
int A[DMAX], Best[DMAX], poz[DMAX], sol[DMAX];
int n, nr;
void citire()
{
int i;
fin>>n;
for (i=1; i<=n; i++)
fin>>A[i];
}
int cautare_binara(int x, int dim)
{
int dr=dim+1, st=0, mij;
while (dr-st>1)
{
mij=(st+dr)/2;
if (Best[mij]>=x) dr=mij;
else st=mij;
}
if (dr>dim)
return 0;
return dr;
}
void Dinamica()
{
int i, aux;
nr=1;
Best[1]=A[1]; poz[1]=1;
for (i=2; i<=n; i++)
{
if (A[i] <= Best[nr]) ///cautare binara
{
Best[cautare_binara(A[i], nr)]=A[i];
poz[i]=cautare_binara(A[i], nr);
}
else
{
nr++;
Best[nr]=A[i];
poz[i]=nr;
}
}
}
void afisare()
{
int i, aux=nr;
for (i=n; i>=1; i--)
if (poz[i]==aux)
sol[aux--]=A[i];
fout<<nr<<'\n';
for (i=1; i<=nr; i++)
fout<<sol[i]<<" ";
}
int main()
{
citire();
Dinamica();
afisare();
return 0;
}