Pagini recente » Monitorul de evaluare | Cod sursa (job #1848895) | Cod sursa (job #1686935) | Cod sursa (job #174838) | Cod sursa (job #2968709)
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <limits.h>
const uint32_t MAX_N = 100000;
const uint32_t MAX_N_POW_2 = 65536;
uint32_t v[MAX_N], s[MAX_N], prev[MAX_N];
FILE* fout;
uint32_t Search(uint32_t val, uint32_t len) {
uint32_t pos = len;
for(uint32_t step = MAX_N_POW_2; step; step >>= 1)
if(pos >= step && v[s[pos - step]] >= val)
pos -= step;
return pos;
}
void Output(uint32_t pos) {
if(pos == UINT_MAX)
return;
Output(prev[pos]);
fprintf(fout, "%u ", v[pos]);
}
int main() {
FILE* fin = fopen("scmax.in", "r");
fout = fopen("scmax.out", "w");
uint32_t n;
fscanf(fin, "%u", &n);
for(uint32_t i = 0; i != n; ++i)
fscanf(fin, "%u", v + i);
uint32_t maxLength = 0;
for(uint32_t i = 0; i != n; ++i) {
uint32_t length = Search(v[i], maxLength);
s[length] = i;
prev[i] = length ? s[length - 1] : UINT_MAX;
maxLength = (maxLength < length + 1) ? length + 1 : maxLength;
}
fprintf(fout, "%u\n", maxLength);
uint32_t pos = s[maxLength - 1];
Output(pos);
fclose(fin);
fclose(fout);
return 0;
}