Pagini recente » Cod sursa (job #189050) | Istoria paginii preoni-2008/clasament/runda-2/5-8 | Cod sursa (job #2786165) | Cod sursa (job #814861) | Cod sursa (job #3277848)
#include <fstream>
#define Nmax 100099
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int N, v[Nmax], L, last[Nmax], ante[Nmax];
void SCMAX() {
L = 1; // lungimea maxima gasita
last[1] = 1; // ultimul sir maximal de lungime 1 s-a incheiat pe poz 1
for (int i = 2; i <= N; ++i) {
int st = 1, dr = L;
while (st <= dr) {
int mij = (st + dr) >> 1;
if (v[i] > v[last[mij]]) { // v[i] poate extinde SIGUT sirul care se terminca cu v[ last[ mij] ] , poate chiar mai mult
st=mij+1;
} else { // v[i] trebuie sa extinda un sir al carui termen maxim e mai mare decat v[ last[ mij] ]
dr=mij-1;
}
}
if (st == L+1) {
++L; // am o noua solutie!
}
last[st] = i;
ante[i] = last[st-1];
}
}
void Build(int poz) {
if (ante[poz]) {
Build(ante[poz]);
}
g << v[poz] << ' ';
}
int main () {
f >> N;
for (int i = 1; i <= N; ++i) {
f >> v[i];
}
SCMAX();
g << L << '\n';
Build(last[L]);
return 0;
}