aboutsummaryrefslogtreecommitdiff
path: root/2023/05/5b.c
diff options
context:
space:
mode:
Diffstat (limited to '2023/05/5b.c')
-rw-r--r--2023/05/5b.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/2023/05/5b.c b/2023/05/5b.c
new file mode 100644
index 0000000..aeac8c0
--- /dev/null
+++ b/2023/05/5b.c
@@ -0,0 +1,71 @@
1/* For part 2 we save ranges as (first, last) instead of (first, length) */
2
3#include <inttypes.h>
4#include <stdbool.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8
9#define N 10000
10
11#define MIN(a, b) ((a)<(b)?(a):(b))
12#define MAX(a, b) ((a)>(b)?(a):(b))
13
14bool isnum(char c) { return c >= '0' && c <= '9'; }
15
16void append(int64_t dst[][2], int64_t src[][2], int64_t *nr, int64_t *nnr) {
17 for (int i = 0; i < *nnr; i++) {
18 dst[i+*nr][0] = src[i][0];
19 dst[i+*nr][1] = src[i][1];
20 }
21 *nr += *nnr;
22 *nnr = 0;
23}
24
25int64_t readl(int64_t nums[], char *buf) {
26 int64_t i;
27 for (i = 0; *buf; buf++) {
28 if (!isnum(*buf)) continue;
29 nums[i++] = atoll(buf);
30 while (isnum(*buf)) buf++;
31 }
32 return i;
33}
34
35int main() {
36 char *buf, line[N];
37 int64_t i, li, ri, m, nr, nnr, r[3], range[N][2], next[N][2], aux[N];
38
39 nnr = readl(aux, fgets(line, N, stdin)) / 2;
40 for (i = 0; i < nnr; i++) {
41 next[i][0] = aux[2*i];
42 next[i][1] = aux[2*i+1] + next[i][0] - 1;
43 }
44
45 for (nr = 0; (buf = fgets(line, N, stdin)) != NULL; ) {
46 if (!isnum(*buf)) {
47 append(range, next, &nr, &nnr);
48 continue;
49 }
50
51 readl(r, buf);
52 for (i = 0; i < nr; i++) {
53 li = range[i][0];
54 ri = range[i][1];
55 if (li > ri || r[1] > ri || r[1]+r[2]-1 < li) continue;
56 range[i][1] = MIN(ri, r[1]-1);
57 next[nnr][0] = MAX(li, r[1]) + r[0]-r[1];
58 next[nnr++][1] = MIN(ri, r[1]+r[2]-1) + r[0]-r[1];
59 range[nr][0] = MAX(li, r[1]+r[2]);
60 range[nr++][1] = ri;
61 }
62 }
63
64 append(range, next, &nr, &nnr);
65 for (i = 0, m = -1; i < nr; i++)
66 if (range[i][0] <= range[i][1])
67 m = m == -1 || m > range[i][0] ? range[i][0] : m;
68
69 printf("%" PRId64 "\n", m);
70 return 0;
71}

Generated with cgit - Back to sebastiano.tronto.net