#include #include #include #include #include #include #include #include #include char input[] = { #embed "input.txt" ,'\0' // null terminator }; int width = 0; int height = 0; uint64_t result = 0; uint64_t parseNum(char* str, int* len){ int i = 0; uint64_t out = 0; while(str[i] != ',' && str[i] != '-' && str[i] != '\n'){ out += str[i]-0x30; out *= 10; i++; } out /=10; *len = i; return out; } int numPlaces (uint64_t n) { int r = 1; while (n > 9) { n /= 10; r++; } //printf("%d has %d places\n", n, r); return r; } uint64_t power(uint64_t base, uint64_t exp) { uint64_t i, result = 1; for (i = 0; i < exp; i++) result *= base; return result; } void sort_ranges(uint64_t* starts, uint64_t* ends, int len){ for(int i = 0; istarts[o]){ //printf("%lu is bigger than %lu, so we have a new lowest\n", starts[curr_min], starts[o]); curr_min = o; } } uint64_t tmp_start = starts[curr_min]; uint64_t tmp_end = ends[curr_min]; starts[curr_min] = starts[i]; ends[curr_min] = ends[i]; starts[i] = tmp_start; ends[i] = tmp_end; } } //bool check_fresh(uint64_t storage, uint64_t* starts, uint64_t* ends, int length){ // int guess = length/2; // int diff = length/4; // while(true){ // printf("guess is %d", guess); // diff = (diff/2)+1; // if(storage>starts[guess] && storagestarts[guess]){ // guess += diff; // }else{ // guess -= diff; // } // } // if(storage=starts[i] && storage<=ends[i]){ //printf(" .....fresh \t(is in range %lu - %lu)\n", starts[i], ends[i]); return true; } } //printf(" .....spoiled\n"); return false; } void join_ranges(uint64_t* starts, uint64_t* ends, int* range_count){ int new_count = 0; for(int i = 0; i<*range_count; i++){ int n=0; uint64_t end = ends[i]; while(starts[i+n+1]<=end+1){ n++; if(end