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

/*#define XMALLOC */
#if defined XMALLOC
#include "xmalloc.h"
#else
#define xmalloc(x, y) malloc((x))
#define xfree(x, y) free((x))
#define xrealloc(x, y, z) realloc((x), (y))
#define xmallocdump()
#endif
#define ID_VECTOR 1001
#define ID_ARRAY  1002


#define T int
typedef struct {
  T *array;
  int size;
} Vector;

int init_vector(Vector **v, int size) {
  if ((*v = xmalloc(sizeof(Vector), ID_VECTOR)) == 0)
    return 0;
  if (((*v)->array = xmalloc(sizeof(T) * size, ID_ARRAY)) != 0) { /* OK */
    (*v)->size = size;
    return 1;
  }
  return 0;
}

int substitute_vector(Vector *v, int index, T value) {
  int n, *alloc;
  if (index < v->size) {
    (v->array)[index] = value;
    return 1;
  }
  n = index * 2;
  if ((alloc = xrealloc(v->array, sizeof(T) * n, ID_ARRAY)) != 0) { /* OK */
    v->array = alloc;
    v->size = n;
    (v->array)[index] = value;
    return 1;
  }
  return 0;
}

T refer_vector(Vector *v, int index) {
  if (index < v->size)
    return (v->array)[index];
  perror("out of bounds in refering, aborted\n");
  exit(1);
}

void release_vector(Vector **v) {
  (*v)->size = 0;
  xfree((*v)->array, ID_ARRAY);
  xfree(*v, ID_VECTOR);
  *v = 0;
}

#define N 1
int main() {
  Vector *a;
  int last, i, bids, input, ferr;

  if (!init_vector(&a, 10)) { perror("memory full(init), aborted.\n"); exit(1); }
restart:
  last = 3;
  ferr = 0;
  for (i = 0; i < last; i++)
    if(!substitute_vector(a, i, i + 1)) {
      ferr = 1;
      break;
    }
  if (ferr) { perror("memory full(subst4init), aborted.\n"); exit(1); }
  for (;;) {
    ferr = 0;
    for (i = 0; i < last; i++)
      printf("[%d]%d, ", i, refer_vector(a, i));
    putchar('\n');
    bids = refer_vector(a, 0) + refer_vector(a, last - 1);
    printf("bids: %d\n", bids);
    printf("win or loss? (win:positive, loss:zero) : "); scanf("%d", &input);
    if (input < 0)
      break;
    if (input) {
      for (i = 0; i < last - 1; i++)
        if (!substitute_vector(a, i, refer_vector(a, i + 1))) { ferr = 1; }
      last -= 2;
    } else {
      if (!substitute_vector(a, last, bids)) { ferr = 1; }
      last++;
    }
    if (ferr)
      break;
    if (last < 2) {
      printf("go for the initial step.\n");
      goto restart;
    }
  }
  if (ferr) { perror("memory full(subst4init), aborted.\n"); exit(1); }
  release_vector(&a);
  xmallocdump();
  return 0;

}

/* end */
