

#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;
}