Pagini recente » Cod sursa (job #2342843) | Cod sursa (job #2920364) | Cod sursa (job #980040) | Cod sursa (job #832503) | Cod sursa (job #2883114)
#include <fstream>
#include <algorithm>
#define NMAX 100000
#define VALMAX 2000000000
#define INF 2100000000
using namespace std;
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
int v[NMAX + 1];
int vlastval[NMAX + 1]; /// vlastval[i] -- valoarea in care subsirul crescator de lungimea i se opreste
int vprev[NMAX + 1]; /// vprev[i] -- pozitia elementului dinainte lui i in subsirul de lungime maxima care se termina pe pozitia i
int vindex[NMAX + 1]; /// vindex[i] -- indexul in care subsecventa de lungime i se termina
int vsol[NMAX + 1];
int main() {
int n, val, i, j, poz, scmax, lastscmax, nsol;
cin >> n;
vlastval[0] = -INF;
vindex[0] = -1;
for (i = 1; i <= n; i++)
vlastval[i] = INF;
scmax = 0;
for (i = 0; i < n; i++) {
cin >> val;
v[i] = val;
poz = upper_bound(vlastval, vlastval + n + 1, val) - vlastval;
if (vlastval[poz] > val && val > vlastval[poz - 1]) {
vlastval[poz] = val;
vindex[poz] = i;
vprev[i] = vindex[poz - 1];
if (poz > scmax)
scmax = poz, lastscmax = i;
}
}
cout << scmax << "\n";
nsol = 0;
while (lastscmax >= 0) {
vsol[nsol++] = v[lastscmax];
lastscmax = vprev[lastscmax];
}
for (i = nsol - 1; i >= 0; i--)
cout << vsol[i] << " ";
return 0;
}