Pagini recente » Cod sursa (job #1938026) | Cod sursa (job #2119498) | Cod sursa (job #1478576) | Cod sursa (job #2386822) | Cod sursa (job #2360265)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int MAXN = 100001;
const int INF = 2000000001;
int a[MAXN];
int lastmin[MAXN]; //lastmin[i] = pozitia celui mai mic nr in care se termina un subsir crescator de lg i
int poz[MAXN]; //poz[i] = pozitia elementului care preceda pe a[i] in subsirul crescator de lg i
int N, lmax;
void citire() {
in >> N;
for(int i = 1; i <= N; ++i)
in >> a[i];
}
int caut(int p, int u, int x) {
//OBS: sirul a[lastmin[i]] este crescator!!! de aceea aplicam cautare binara pe sir screscator
while(p <= u) {
int m = (p + u) / 2;
if(a[lastmin[m]] < x)
p = m + 1;
else
u = m - 1;
}
return p - 1;
}
void subsir() {
lmax = 1;
a[0] = INF;
for(int i = 0; i <= N; ++i)
lastmin[i] = 0;
lastmin[1] = 1;
poz[1] = 0;
for(int i = 2; i <= N; ++i) {
int k = caut(1, lmax, a[i]);
++k;
if(a[lastmin[k]] > a[i]) {
poz[i] = lastmin[k - 1];
lastmin[k] = i;
lmax = max(lmax, k);
}
}
}
void tipar() {
out << lmax << '\n';
int stiva[lmax + 1], vf = 0;
for(int i = lastmin[lmax]; i > 0; i = poz[i])
stiva[++vf] = a[i];
while(vf) {
out << stiva[vf] << ' ';
--vf;
}
}
int main() {
citire();
subsir();
tipar();
return 0;
}