1. Code should not mix pointer types.  On systems where `sizeof(unsigned short) < sizeof(int)`, this is a program flaw.

        // int *children = malloc(size * sizeof(unsigned short));
        int *children = malloc(size * sizeof(int));
        // or even better
        int *children = malloc(size * sizeof *children);

2. For high portability, use type `size_t` or `unsigned long` for values that may exceed `65,535`:

        // unsigned int size = count_children(input);
        size_t size = count_children(input);
        int *children = malloc(size * sizeof *children);

3. Code should check the return value from `fscanf(input, "%d",&count);` and `fscanf(input, "%d",&children[i]);`

4.  Mixing types for finding the maximum is very questionable.  Suggest re-write

        size_t chck_tall(const int *children, size_t size) {
          size_t total = 0;
          int tmp_max = 0;   // or maybe INT_MIN
          for(size_t i = size - 1; i-- > 0; )  {
            if(children[i] > tmp_max) {
              tmp_max = children[i];
              total++;
            }
          }
          return total;
        }