struct IntList {
    int size;
    int* data;     
};

IntList* listNewInt() {
    IntList* list = new IntList[1];
    list->size = 0;
    list->data = new int[4];
    return list;
}

void listAdd(IntList* list, int i) {
    int l = length(list->data);
    if(list->size >= l) {
        int* newData = new int[l * 2];
        for(int i = 0; i < l; i++) {
            newData[i] = list->data[i];
        }
        delete list->data;
        list->data = newData;
    }
    list->data[list->size] = i;
    list->size++;
}

int listGetLength(IntList* list) {
    return list->size;
}

int listGetIndex(IntList* list, int index) {
    return list->data[index];
}

void listDelete(IntList* list) {
    delete list->data;
    delete list;
}

void main() {
    IntList* list = listNewInt();

    for(int i = 0; i < 5; i++) {
        listAdd(list, i * 50 + 3);
    }
    
    for(int i = 0; i < listGetLength(list); i++) {
        print listGetIndex(list, i);
    }
    
    listDelete(list);
}