Pagini recente » Statistici Noki H (nokih53838) | Monitorul de evaluare | Istoria paginii utilizator/catlinv | ENACHEE | Cod sursa (job #1089076)
//
// main.cpp
// subsir_crescator_maxima_n*log(n)
//
// Created by Casuneanu Andrei on 21/01/14.
// Copyright (c) 2014 Casuneanu Andrei. All rights reserved.
//
#include <fstream>
#define IN "scmax.in"
#define OUT "scmax.out"
#define DMAX 100008
using namespace std;
ifstream fin(IN);
ofstream fout(OUT);
int n;
int a[DMAX];
int best[DMAX];
int nbest;
int poz[DMAX];
int sir[DMAX];
void citire();
void showtime();
int cautare_binara(int[], int, int);
void afisare();
int main(int argc, const char * argv[])
{
citire();
showtime();
afisare();
return 0;
}
void afisare()
{
int i;
fout <<nbest<<'\n';
for (i=1; i<=nbest; i++)
fout <<sir[i]<<' ';
fout <<'\n';
fout.close();
}
void showtime()
{
best[1]=a[1]; poz[1]=1; nbest=1;
int i;
int k;
for (i=2; i<=n; i++)
{
if (a[i]>best[nbest]) {best[++nbest]=a[i]; poz[i]=nbest;}
else
{
k=cautare_binara(best, nbest, a[i]);
best[k]=a[i];
poz[i]=k;
}
}
int caut=nbest;
for (i=n; i>0; i--)
if (poz[i]==caut)
{
sir[caut]=a[i];
caut--;
}
}
int cautare_binara(int A[], int dim, int x)
{
int hi=dim+1,lo =0, mid;
while (hi-lo>1)
{
mid=(lo+hi)/2;
if (A[mid]>x) hi=mid;
else lo=mid;
}
if (hi == dim+1) return 0;
return hi;
}
void citire()
{
fin >>n;
int i;
for (i=1; i<=n; i++)
fin >>a[i];
}