#pragma once #include #define min(A, B) ((A < B) ? (A) : (B)) #define max(A, B) ((A > B) ? (A) : (B)) #define better(GT, A, B) (GT ? max((A), (B)) : min((A), (B))) template struct Array { T *data; int len; T &operator[](int i) { return data[i]; } }; template Array make_array(int len) { return { .data=(T*)malloc(sizeof(T)*len), .len=len }; } template T back(Array &a) { return a.data[a.len-1]; } template T front(Array &a) { return a.data[0]; } template struct DynArray { T* _data; int end; int cap; T &operator[](int i) { return _data[i]; } }; template DynArray make_dynarray(int cap) { return { ._data=(T*)malloc(sizeof(T)*cap), .end=0, .cap=cap }; } template void resize(DynArray &a, int new_cap) { T* old = a._data; a._data = (T*)malloc(sizeof(T)*new_cap); memcpy(a._data, old, min(sizeof(T)*a.end, sizeof(T)*new_cap)); a.cap = new_cap; free(old); } template void append(DynArray &a, T el) { if (a.end == a.cap) resize(a, min(1, a.cap*2)); a[a.end++] = el; } template T back(DynArray &a) { return a._data[a.end-1]; } template T front(DynArray &a) { return a._data[0]; }