Pagini recente » Cod sursa (job #1680526) | Cod sursa (job #947900) | Cod sursa (job #2691651) | Cod sursa (job #1922371) | Cod sursa (job #2267052)
#include <fstream>
#define NMAX 100002
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[NMAX], poz[NMAX], best[NMAX], lgmax, s[NMAX];
void citire();
void constrbest();
void afisare();
int cautbin(int x);
int main()
{
citire();
constrbest();
afisare();
return 0;
}
void citire()
{
int i;
fin >> n;
for (i = 1; i <= n; i++)
fin >> a[i];
}
void constrbest()
{
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 = cautbin(a[i]);
best[pozitie] = a[i];
poz[i] = pozitie;
}
}
void afisare()
{
int i, cine;
fout << lgmax << '\n';
cine = lgmax;
for (i = n; i >= 1; i--)
{
if (poz[i] == cine)
{
s[cine] = a[i];
cine--;
}
}
for (i = 1; i <= lgmax; i++)
fout << s[i] << ' ';
}
int cautbin(int x)
{
//caut binar in best caut cel mai mic element >= x
//returnez pozitia lui
int st = 0, dr = lgmax + 1, mijloc;
while (dr - st > 1)
{
mijloc = (st + dr) / 2;
if (best[mijloc] >= x)
dr = mijloc;
else st = mijloc;
}
return dr;
}