#include #include #include #include #include #include #define PANIC do { \ fprintf(stderr, "panic at %s:%d\n", __FILE__, __LINE__); \ abort(); \ } while (0) void expect_char(char e) { int c = fpeek(stdin); if (c != e) { PANIC; } fgetc(stdin); } void skip_space() { while (1) { int c = fpeek(stdin); if (c == EOF) return; if (isspace(c)) { fgetc(stdin); } else { return; } } } bool string2long(const char *s, long *num) { char *end; errno = 0; *num = strtol(s, &end, 10); if (end == s) { return false; } if (errno != 0) { return false; } return true; } int64_t parse_integer() { long ret; StrBuilder sb; StrBuilder_init(&sb); while (1) { int c = fpeek(stdin); if (isdigit(c)) { fgetc(stdin); StrBuilder_append_char(&sb, c); } else { break; } } if (strlen(sb.buf) == 0) { PANIC; } StrBuilder_append_char(&sb, '\0'); if (!string2long(sb.buf, &ret)) { PANIC; } free(sb.buf); return ret; } typedef struct { int64_t start; int64_t end; } Range; void Range_show(Range self, FILE *fp) { fprintf(fp, "%ld-%ld", self.start, self.end); } VECTOR_DEF(Range) VECTOR_IMPL(Range) Range parse_range() { Range ret; ret.start = parse_integer(); expect_char('-'); ret.end = parse_integer(); expect_char('\n'); return ret; } int main() { RangeVector ranges; RangeVector_init(&ranges); int c; while (1) { c = fpeek(stdin); if (c == '\n') { break; } else if (isdigit(c)) { Range r = parse_range(); RangeVector_push_back(&ranges, r); } else { PANIC; } } expect_char('\n'); LongVector ids; LongVector_init(&ids); while (1) { c = fpeek(stdin); if (isdigit(c)) { long id = parse_integer(); LongVector_push_back(&ids, id); c = fpeek(stdin); if (c == EOF) break; expect_char('\n'); } } int count = 0; for (int i = 0; i < LongVector_len(&ids); i++) { long n = ids.buffer[i]; for (int j = 0; j < RangeVector_len(&ranges); j++) { Range r = ranges.buffer[j]; if (n >= r.start && n <= r.end) { count++; break; } } } printf("%d\n", count); RangeVector_free(&ranges); LongVector_free(&ids); return 0; }