Pagini recente » Cod sursa (job #443482) | Cod sursa (job #1860213) | Cod sursa (job #2873583) | Cod sursa (job #2349678) | Cod sursa (job #2694618)
#include <iostream>
#include <stdio.h>
#define NMAX 100000
#define VALMAX 2000000000
using namespace std;
FILE *fin, *fout;
int v[NMAX + 1], s[NMAX + 1], prev1[NMAX + 1];
int bs(int st, int dr, int val) {
int i, pas;
i = st - 1;
pas = (1 << 16);
while (pas) {
if (i + pas <= dr && v[s[i + pas]] < val)
i += pas;
pas >>= 1;
}
return i + 1;
}
void afis(int poz) {
if (poz == -1)
return;
afis(prev1[poz]);
fprintf(fout, "%d ", v[poz]);
}
int main() {
int n, i, j, scmax, poz;
fin = fopen("scmax.in", "r");
fscanf(fin, "%d", &n);
for (i = 0; i < n; i++)
fscanf(fin, "%d", &v[i]);
fclose( fin );
for (i = 0; i < n; i++)
s[i] = VALMAX + 1;
scmax = 0;
for (i = 0; i < n; i++) {
poz = bs(0, scmax - 1, v[i]);
s[poz] = i;
prev1[i] = -1;
if (poz > 0)
prev1[i] = s[poz - 1];
if (poz + 1 > scmax)
scmax = poz + 1;
}
fout = fopen("scmax.out", "w");
fprintf(fout, "%d\n", scmax);
afis(s[scmax - 1]);
fclose( fout );
return 0;
}