Pagini recente » Cod sursa (job #2480379) | Cod sursa (job #2031318) | Cod sursa (job #2031323) | Cod sursa (job #2194319) | Cod sursa (job #2012521)
#include <stdio.h>
FILE *fin, *fout;
const int MAX_N = 100000;
int v[MAX_N + 1], min[MAX_N + 1], p[MAX_N + 1];
int N;
int ans = 1, end = 1;
inline int find(int nr1) {
int r = 0, pas = 1 << 17;
while(pas) {
if(r + pas <= ans && v[min[r + pas]] < nr1)
r += pas;
pas >>= 1;
}
return r;
}
void print(int poz) {
if(p[poz]) print(p[poz]);
fprintf(fout, "%d ", v[poz]);
}
int main() {
fin = fopen("scmax.in", "r");
fout = fopen("scmax.out", "w");
fscanf(fin, "%d", &N);
for(int i = 1;i <= N;i++)
fscanf(fin, "%d", &v[i]);
min[1] = 1;
for(int i = 2;i <= N;i++) {
int poz = find(v[i]);
p[i] = min[poz];
min[poz + 1] = i;
if(ans < poz + 1) {
ans = poz + 1;
end = i;
}
}
fprintf(fout, "%d\n", ans);
print(end);
fclose(fin);
fclose(fout);
return 0;
}