#include <bits/stdc++.h>
using namespace std;
/* Allocate 1MB in memory pool and use this memory only to assign whenever somebody ask for memory */
template <typename T>
struct Allocator {
using value_type = T; // type alias
unordered_map<size_t, size_t> memHash;
Allocator() {
int one_mb = 1024 * 1024;
void * add = malloc(one_mb);
memHash[(size_t)add] = one_mb;
}
// n is number of items
T* allocate(size_t n) {
n *= sizeof(T);
for (auto &[address, sz]: memHash) {
if (sz < n) continue;
if (sz > n) {
memHash[address + n] = sz - n; // [0, 10], [13, 19]
}
memHash.erase(address);
return (T *)address;
}
return nullptr;
// return (T *)malloc(n * sizeof(T)); // n bytes
}
void deallocate(T *ptr, size_t sz) {
memHash[(size_t)ptr] = sz;
if (memHash.count((size_t)ptr + sz)) {
memHash[(size_t)ptr] = sz + memHash[(size_t)ptr + sz];
memHash.erase((size_t)ptr + sz);
}
// free(ptr);
}
};
int main()
{
vector<int, Allocator<int>> v;
for (int i = 0; i < 10; i++) v.emplace_back(i);
for (auto &i: v) cout << i << " ";
cout << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovKiBBbGxvY2F0ZSAxTUIgaW4gbWVtb3J5IHBvb2wgYW5kIHVzZSB0aGlzIG1lbW9yeSBvbmx5IHRvIGFzc2lnbiB3aGVuZXZlciBzb21lYm9keSBhc2sgZm9yIG1lbW9yeSAqLwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IEFsbG9jYXRvciB7CiAgICB1c2luZyB2YWx1ZV90eXBlID0gVDsgLy8gdHlwZSBhbGlhcwogICAgdW5vcmRlcmVkX21hcDxzaXplX3QsIHNpemVfdD4gbWVtSGFzaDsKCiAgICBBbGxvY2F0b3IoKSB7CiAgICAgICAgaW50IG9uZV9tYiA9IDEwMjQgKiAxMDI0OwogICAgICAgIHZvaWQgKiBhZGQgPSBtYWxsb2Mob25lX21iKTsKICAgICAgICBtZW1IYXNoWyhzaXplX3QpYWRkXSA9IG9uZV9tYjsKICAgIH0KCiAgICAvLyBuIGlzIG51bWJlciBvZiBpdGVtcwogICAgVCogYWxsb2NhdGUoc2l6ZV90IG4pIHsKICAgICAgICBuICo9IHNpemVvZihUKTsKICAgICAgICBmb3IgKGF1dG8gJlthZGRyZXNzLCBzel06IG1lbUhhc2gpIHsKICAgICAgICAgICAgaWYgKHN6IDwgbikgY29udGludWU7CiAgICAgICAgICAgIGlmIChzeiA+IG4pIHsKICAgICAgICAgICAgICAgIG1lbUhhc2hbYWRkcmVzcyArIG5dID0gc3ogLSBuOyAvLyBbMCwgMTBdLCBbMTMsIDE5XQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1lbUhhc2guZXJhc2UoYWRkcmVzcyk7CiAgICAgICAgICAgIHJldHVybiAoVCAqKWFkZHJlc3M7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxscHRyOwogICAgICAgIC8vIHJldHVybiAoVCAqKW1hbGxvYyhuICogc2l6ZW9mKFQpKTsgLy8gbiBieXRlcwogICAgfQogICAgCiAgICB2b2lkIGRlYWxsb2NhdGUoVCAqcHRyLCBzaXplX3Qgc3opIHsKICAgICAgICBtZW1IYXNoWyhzaXplX3QpcHRyXSA9IHN6OwogICAgICAgIGlmIChtZW1IYXNoLmNvdW50KChzaXplX3QpcHRyICsgc3opKSB7CiAgICAgICAgICAgIG1lbUhhc2hbKHNpemVfdClwdHJdID0gc3ogKyBtZW1IYXNoWyhzaXplX3QpcHRyICsgc3pdOwogICAgICAgICAgICBtZW1IYXNoLmVyYXNlKChzaXplX3QpcHRyICsgc3opOwogICAgICAgIH0KICAgICAgICAvLyBmcmVlKHB0cik7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIHZlY3RvcjxpbnQsIEFsbG9jYXRvcjxpbnQ+PiB2OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB2LmVtcGxhY2VfYmFjayhpKTsKICAgIGZvciAoYXV0byAmaTogdikgY291dCA8PCBpIDw8ICIgIjsKICAgIGNvdXQgPDwgIlxuIjsKICAgIAogICAgcmV0dXJuIDA7Cn0=
MTAKYWJhCmdlZWtzZm9yZ2Vla3MKZ2Vla3Nmb3JnZWVrcwpnZWVrc2ZvcmdlZWtzCmdlZWtzZm9yZ2Vla3MKZ2Vla3Nmb3JnZWVrcwpnZWVrc2ZvcmdlZWtzCmdlZWtzZm9yZ2Vla3MKZ2Vla3Nmb3JnZWVrcwpnZWVrc2ZvcmdlZWtz
10
aba
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks