#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>

void uintprint3(uint32_t *a)
{
  printf("%u %u %u\n", a[0], a[1], a[2]);
}

void uintprint4(uint32_t *a)
{
  printf("%u %u %u %u\n", a[0], a[1], a[2], a[3]);
}

void insert3(uint32_t in[static 3], uint32_t value, uint32_t out[static 4])
{
  /*                  0      1      2      3      4      5      6      7      8      9      10     11     12    */
  uint32_t tmp[13] = {value, in[0], in[1], in[2], value, in[0], in[1], value, in[2], in[0], value, in[1], in[2]};
  uint8_t bits = ((value <= in[0]) << 2 ) | ((value <= in[1]) << 1) | (value <= in[2]);
  static const uint8_t b[] =
  {
    [0b000] = 1,
    [0b001] = 5,
    [0b010] = 255,
    [0b011] = 9,
    [0b100] = 255,
    [0b101] = 255,
    [0b110] = 255,
    [0b111] = 0
  };
  if (b[bits] > sizeof(tmp)/sizeof(uint32_t)) {
    printf("Kakoj bagor )))\n");
    exit(-1);
  }
  memcpy(out, tmp + b[bits], 4*sizeof(uint32_t));
}
 
int main(void)
{
  uint32_t a[] = {1, 3, 5};
  printf("Input: "); uintprint3(a);
  printf("Output:\n");
  uint32_t b[4]; insert3(a, 0, b); uintprint4(b);
  uint32_t c[4]; insert3(a, 1, c); uintprint4(c);
  uint32_t d[4]; insert3(a, 2, d); uintprint4(d);
  uint32_t e[4]; insert3(a, 3, e); uintprint4(e);
  uint32_t f[4]; insert3(a, 4, f); uintprint4(f);
  uint32_t g[4]; insert3(a, 5, g); uintprint4(g);
  uint32_t h[4]; insert3(a, 6, h); uintprint4(h);

  uint32_t i[] = {5, 3, 1};
  printf("Input: "); uintprint3(i);
  printf("Output:\n");
  uint32_t j[4]; insert3(i, 2, j); uintprint4(j);

  return 0;
}