Pagini recente » Cod sursa (job #589180) | Cod sursa (job #216118) | Cod sursa (job #700669) | Cod sursa (job #939880) | Cod sursa (job #1089748)
#include <cstdio>
#define NMAX 100005
using namespace std;
FILE * fin = fopen("scmax.in", "r");
FILE * fout = fopen("scmax.out", "w");
void citire();
void pd();
void constr_sol();
void afisare();
int binar(int, int, int);
int n, a[NMAX];
int best[NMAX];
int poz[NMAX];
int lgmax, sir[NMAX];
int main()
{
citire();
pd();
constr_sol();
afisare();
return 0;
}
void citire()
{
int i;
fscanf(fin, "%d", &n);
for (i = 1; i <= n; i ++)
fscanf(fin, "%d", &a[i]);
}
void pd()
{
int i, pozitie;
best[1] = a[1];
poz[1] = 1;
for (i = 2; i <= n; i ++)
{
if (a[i] > best[lgmax])
{
best[++lgmax] = a[i];
poz[i] = lgmax;
}
else
{
pozitie = binar(a[i], 0, lgmax+1);
best[pozitie] = a[i];
poz[i] = pozitie;
}
}
}
int binar(int x, int st, int dr)
{
int mij;
while (dr - st > 1)
{
mij = (dr - st)/2 + st;
if (best[mij] < x)
st = mij;
if (x < best[mij])
dr = mij;
if (best[mij] == x)
return mij;
}
return dr;
}
void constr_sol()
{
int i, x;
x = lgmax;
for (i = n; i > 0; i -- )
if (poz[i] == x)
{
sir[x] = a[i];
x --;
}
}
void afisare()
{
int i;
fprintf(fout, "%d\n", lgmax);
for (i = 1; i <= lgmax; i ++)
fprintf(fout, "%d ", sir[i]);
fprintf(fout, "\n");
}