typedef int valuetype;

typedef struct {
    size_t tos;
    size_t length;
    valuetype *values;
} stack;

typedef struct {
    stack *stacks;
    size_t length;
} stacklist;

static void fatal(const char *message) {
    fprintf(stderr, "pizdariki: %s\n", message);
    exit(EXIT_FAILURE);
}

static valuetype stack_get(stack *stack) {
    if (stack->tos == 0) {
        fatal("empty stack");
    }
    
    return stack->values[stack->tos - 1];
}

static valuetype stack_pop(stack *stack) {
    if (stack->tos == 0) {
        fatal("stack underflow");
    }
    
    return stack->values[--stack->tos];
}

static void stack_push(stack *stack, valuetype value) {
    if (stack->tos == stack->length) {
        fatal("stack overflow");
    }
    
    stack->values[stack->tos++] = value;
}


static void stack_init(stack *stack, size_t length) {
    stack->tos = 0;
    stack->length = length;
    stack->values = malloc(sizeof(*stack->values) * stack->length);
    
    if (!stack->values) {
        fatal("no memory");
    }
}

static void stacklist_init(stacklist *list) {
    size_t list_length;
    printf("Type number of stacks: ");
    if (!scanf("%zu", &list_length)) {
        fatal("wrong input");
    }
    
    list->length = list_length;
    list->stacks = malloc(sizeof(*list->stacks) * list_length);
    if (!list->stacks) {
        fatal("no memory");
    }
    
    for (size_t i = 0; i < list_length; i++) {
        size_t stack_length;
        printf("Type length of the stack %zu: ", i);
        if (!scanf("%zu", &stack_length)) {
            fatal("wrong input");
        }
        stack_init(&list->stacks[i], stack_length);
    }
}
