void *malloc(unsigned long); int printf(char *, ...); long atol(char *); void exit(int); int open(char *, int, int); long read(int, void *, unsigned long); void insertion_sort(int *a, long n) { long i, j; for (i = 1; i < n; ++i) { for (j = i; j > 0; --j) { if (a[j] < a[j-1]) { int tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; } else { break; } } } } void *read_arr(int fd, int *len) { int size = 1024 * 1024 * 20; int i; char *arr = malloc(size); for (i = 0; ; ) { int rd = read(fd, arr + i, size - i); if (rd == -1) exit(2); if (rd == 0) break; i += rd; } printf("input is collected\n"); *len = i; return arr; } int main(int argc, char **argv) { int i, len; unsigned int sum = 0; int *arr; int fd; if (argc != 2) { printf("%d\n", argc); return 1; } len = atol(argv[1]); fd = open(argv[1], 0, 0); if (fd == -1) return 1; arr = read_arr(fd, &len); len /= 4; if (len != 64000) return 10; insertion_sort(arr, len); for (i = 0; i < len; ++i) sum = 2 * sum + arr[i]; printf("%u\n", sum); return 0; }