#pragma once
template<typenameT,typenameptr_t=int>structVectorPool{vector<T>pool;vector<ptr_t>st;intidx;intcap;// pool[0] is missing number (assuming nil)VectorPool(ints=4):pool(s),st(),idx(1),cap(s){assert(s>0);}inlineT&operator[](ptr_ti){returnpool[int(i)];}voidreallocate(){assert(idx==cap&&st.size()==0);cap*=2;pool.resize(cap,T());}ptr_talloc(){if(idx!=cap)returnptr_t(idx++);if(st.empty()){reallocate();returnptr_t(idx++);}ptr_tret=st.back();st.pop_back();returnret;}template<typename...Args>ptr_tmy_new(Args...args){ptr_tret=alloc();pool[int(ret)]=T(args...);returnret;}voidfree(ptr_ti){st.push_back(i);}voidclear(){idx=1;st.clear();}};
#line 2 "misc/vector-pool.hpp"
template<typenameT,typenameptr_t=int>structVectorPool{vector<T>pool;vector<ptr_t>st;intidx;intcap;// pool[0] is missing number (assuming nil)VectorPool(ints=4):pool(s),st(),idx(1),cap(s){assert(s>0);}inlineT&operator[](ptr_ti){returnpool[int(i)];}voidreallocate(){assert(idx==cap&&st.size()==0);cap*=2;pool.resize(cap,T());}ptr_talloc(){if(idx!=cap)returnptr_t(idx++);if(st.empty()){reallocate();returnptr_t(idx++);}ptr_tret=st.back();st.pop_back();returnret;}template<typename...Args>ptr_tmy_new(Args...args){ptr_tret=alloc();pool[int(ret)]=T(args...);returnret;}voidfree(ptr_ti){st.push_back(i);}voidclear(){idx=1;st.clear();}};