#include <iostream>
#include <vector>
#include <list>
#include <array>
#include <iterator>
#include <algorithm>
template<class ReversibleContainer>
void add1(ReversibleContainer &arr, const typename ReversibleContainer::value_type &val, const int code = 0)
{
int step = 1;
auto beg = arr.begin();
auto end = arr.end();
auto count = std::distance(beg, end);
if (code < 0) {
count = -code;
step = -1;
std::swap(beg, end);
}
else if(code > 0) {
count = code;
}
for(; count > 0 && beg != end; std::advance(beg, step))
{
auto& cur = *beg;
if( cur == val )
cur++, count--;
}
}
int main(int argc, char *argv[])
{
std::vector<int> vec = {1,4,1,5,1};
std::list<int> lst = {1,4,1,5,1};
std::array<int,5> arr = {1,4,1,5,1};
add1(vec, 1, 0);
add1(lst, 1, 2);
add1(arr, 1, -2);
for(auto b = vec.begin(); b != vec.end(); ++b)
std::cout << *b << " ";
std::cout << std::endl;
for(auto b = lst.begin(); b != lst.end(); ++b)
std::cout << *b << " ";
std::cout << std::endl;
for(auto b = arr.begin(); b != arr.end(); ++b)
std::cout << *b << " ";
std::cout << std::endl;
return 0;
}
CgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxsaXN0PgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KIAp0ZW1wbGF0ZTxjbGFzcyBSZXZlcnNpYmxlQ29udGFpbmVyPgogdm9pZCBhZGQxKFJldmVyc2libGVDb250YWluZXIgJmFyciwgY29uc3QgdHlwZW5hbWUgUmV2ZXJzaWJsZUNvbnRhaW5lcjo6dmFsdWVfdHlwZSAmdmFsLCBjb25zdCBpbnQgY29kZSA9IDApIAp7CiAgICBpbnQgc3RlcCA9IDE7CiAgICBhdXRvIGJlZyA9IGFyci5iZWdpbigpOwogICAgYXV0byBlbmQgPSBhcnIuZW5kKCk7CiAgICBhdXRvIGNvdW50ID0gc3RkOjpkaXN0YW5jZShiZWcsIGVuZCk7CgogICAgaWYgKGNvZGUgPCAwKSB7CiAgICAgICAgY291bnQgPSAtY29kZTsKICAgICAgICBzdGVwICA9IC0xOwogICAgICAgIHN0ZDo6c3dhcChiZWcsIGVuZCk7CiAgICB9CiAgICBlbHNlIGlmKGNvZGUgPiAwKSB7CiAgICAgICAgY291bnQgPSBjb2RlOwogICAgfQogCiAgICBmb3IoOyBjb3VudCA+IDAgJiYgYmVnICE9IGVuZDsgc3RkOjphZHZhbmNlKGJlZywgc3RlcCkpCiAgICB7CiAgICAgICAgYXV0byYgY3VyID0gKmJlZzsKICAgICAgICBpZiggY3VyID09IHZhbCApCiAgICAgICAgICAgIGN1cisrLCBjb3VudC0tOwogICAgfQp9CiAKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgc3RkOjp2ZWN0b3I8aW50PiB2ZWMgPSB7MSw0LDEsNSwxfTsKICAgIHN0ZDo6bGlzdDxpbnQ+ICAgbHN0ID0gezEsNCwxLDUsMX07CiAgICBzdGQ6OmFycmF5PGludCw1PiBhcnIgPSB7MSw0LDEsNSwxfTsKCiAgICBhZGQxKHZlYywgMSwgMCk7CiAgICBhZGQxKGxzdCwgMSwgMik7CiAgICBhZGQxKGFyciwgMSwgLTIpOwoKICAgIGZvcihhdXRvIGIgPSB2ZWMuYmVnaW4oKTsgYiAhPSB2ZWMuZW5kKCk7ICsrYikKICAgIAlzdGQ6OmNvdXQgPDwgKmIgPDwgIiAiOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCiAgICBmb3IoYXV0byBiID0gbHN0LmJlZ2luKCk7IGIgIT0gbHN0LmVuZCgpOyArK2IpCiAgICAJc3RkOjpjb3V0IDw8ICpiIDw8ICIgIjsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CgogICAgZm9yKGF1dG8gYiA9IGFyci5iZWdpbigpOyBiICE9IGFyci5lbmQoKTsgKytiKQogICAgCXN0ZDo6Y291dCA8PCAqYiA8PCAiICI7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKICAgIHJldHVybiAwOwp9