#include <iostream>
#include <queue>
using std::vector;
using std::cout;
using std::endl;
using std::fill;
using std::min;
template<typename data_t, typename out_t>
struct MovingAverage {
size_t window, size, ptr;
vector<data_t> data;
out_t sum;
explicit MovingAverage(size_t n) {
init(n);
}
void init(size_t n) {
data.resize(n);
fill(data.begin(), data.end(), 0);
window = n;
size = 0;
ptr = 0;
sum = 0;
}
out_t feed(data_t val) {
sum = sum + val - data[ptr];
data[ptr] = val;
size = min(size + 1, window);
ptr = (ptr + 1) % window;
return sum / size;
}
};
int main() {
vector<int> array{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
MovingAverage<int, double> avg(0);
for (size_t size = 1; size <= array.size(); size++) {
avg.init(size);
cout << "size " << size << ": ";
for (int elem: array) {
cout << avg.feed(elem) << " ";
}
cout << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CnVzaW5nIHN0ZDo6dmVjdG9yOwp1c2luZyBzdGQ6OmNvdXQ7CnVzaW5nIHN0ZDo6ZW5kbDsKdXNpbmcgc3RkOjpmaWxsOwp1c2luZyBzdGQ6Om1pbjsKCnRlbXBsYXRlPHR5cGVuYW1lIGRhdGFfdCwgdHlwZW5hbWUgb3V0X3Q+CnN0cnVjdCBNb3ZpbmdBdmVyYWdlIHsKCXNpemVfdCB3aW5kb3csIHNpemUsIHB0cjsKCXZlY3RvcjxkYXRhX3Q+IGRhdGE7CglvdXRfdCBzdW07CglleHBsaWNpdCBNb3ZpbmdBdmVyYWdlKHNpemVfdCBuKSB7CgkJaW5pdChuKTsKCX0KCXZvaWQgaW5pdChzaXplX3QgbikgewoJCWRhdGEucmVzaXplKG4pOwoJCWZpbGwoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLCAwKTsKCQl3aW5kb3cgPSBuOwoJCXNpemUgPSAwOwoJCXB0ciA9IDA7CgkJc3VtID0gMDsKCX0KCW91dF90IGZlZWQoZGF0YV90IHZhbCkgewoJCXN1bSA9IHN1bSArIHZhbCAtIGRhdGFbcHRyXTsKCQlkYXRhW3B0cl0gPSB2YWw7CgkJc2l6ZSA9IG1pbihzaXplICsgMSwgd2luZG93KTsKCQlwdHIgPSAocHRyICsgMSkgJSB3aW5kb3c7CgkJcmV0dXJuIHN1bSAvIHNpemU7Cgl9Cn07CgppbnQgbWFpbigpIHsKCXZlY3RvcjxpbnQ+IGFycmF5ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX07CglNb3ZpbmdBdmVyYWdlPGludCwgZG91YmxlPiBhdmcoMCk7Cglmb3IgKHNpemVfdCBzaXplID0gMTsgc2l6ZSA8PSBhcnJheS5zaXplKCk7IHNpemUrKykgewoJCWF2Zy5pbml0KHNpemUpOwoJCWNvdXQgPDwgInNpemUgIiA8PCBzaXplIDw8ICI6ICI7CgkJZm9yIChpbnQgZWxlbTogYXJyYXkpIHsKCQkJY291dCA8PCBhdmcuZmVlZChlbGVtKSA8PCAiICI7CgkJfQoJCWNvdXQgPDwgZW5kbDsKCX0KCXJldHVybiAwOwp9