Mai intai trebuie sa te autentifici.
Cod sursa(job #2012521)
Utilizator | Data | 18 august 2017 22:56:45 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.95 kb |
#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;
}