Pagini recente » Cod sursa (job #428232) | Cod sursa (job #2534919) | Cod sursa (job #256882) | Cod sursa (job #967498) | Cod sursa (job #2330520)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
const int MAXN = 100001;
int N, a[MAXN]; ///Datele de intrare
int L[MAXN]; ///L[i] = adresa primului element din sirul a
/// pentru care subsirul care incepe
/// cu acel element are lungimea i
int P[MAXN]; ///P[i] = pozitia elementului care urmeaza dupa a[i]
/// in cel mai lung subsir crescator care incepe cu a[i]
/// P[i] = 0, daca un astfel de element nu exista.
int Lmax; ///Lungimea maxima a unui subsir crescator
int cautare(int p, int u, int x)
{
while(p <= u)
{
int m = (p + u) / 2;
if(x < a[L[m]])
p = m + 1;
else
u = m - 1;
}
return p;
}
void generare()
{
for(int i = N; i > 0; i--)
{
int k = cautare(1, Lmax, a[i]);
P[i] = L[k - 1];
if(k > Lmax)
{
Lmax = k;
L[k] = i;
}
else
if(a[L[k]] < a[i])
L[k] = i;
}
}
void afisare()
{
g << Lmax << '\n';
for(int i = L[Lmax]; i > 0; i = P[i])
g << a[i] << ' ';
}
int main()
{
f >> N;
for(int i = 1; i <= N; i++)
f >> a[i];
generare();
afisare();
return 0;
}