#include <iterator>

template<class type>
class value_iterator {
public:
    typedef size_t difference_type;
    typedef type value_type;
    typedef const type& reference;
    typedef const type* pointer;
    typedef std::random_access_iterator_tag iterator_category;

    value_iterator() :ptr() {}
    value_iterator(difference_type offset, const type& value) :off(offset), ptr(&value) {}
    friend bool operator==(const value_iterator& lhs, const value_iterator& rhs) {return lhs.ptr==rhs.ptr && lhs.off==rhs.off;} 
    friend bool operator!=(const value_iterator& lhs, const value_iterator& rhs) {return lhs.ptr!=rhs.ptr || lhs.off!=rhs.off;} 
    value_iterator& operator++() {++off; return *this;}
    value_iterator operator++(int) {return value_iterator(off++, *ptr);}
    value_iterator& operator--() {--off; return *this;}
    value_iterator operator--(int) {return value_iterator(off--, *ptr);}
    value_iterator& operator+=(difference_type o) {off+=o; return *this;}
    friend value_iterator operator+(const value_iterator& it, difference_type o) {return value_iterator(it.off+o, *it.ptr);}
    friend value_iterator operator+(difference_type o, const value_iterator& it) {return value_iterator(it.off+o, *it.ptr);}
    value_iterator& operator-=(difference_type o) {off-=o; return *this;}
    friend value_iterator operator-(const value_iterator& it, difference_type o) {return value_iterator(it.off-o, *it.ptr);}
    friend difference_type operator-(value_iterator lhs, value_iterator rhs) {return lhs.off-rhs.off;}
    reference operator*() const {return *ptr;}
    pointer operator->() const {return ptr;}
    reference operator[](difference_type) const {return *ptr;}
    friend void swap(value_iterator& lhs, value_iterator& rhs) {std::swap(lhs.ptr, rhs.ptr); std::swap(lhs.off, rhs.off);}
private:
    difference_type off;
    const type* ptr;
};
template<class type> value_iterator<type> make_value_iterator(size_t count, const type& value) {return value_iterator<type>(count, value);}
template<class type> value_iterator<type> make_value_iterator(const type& value) {return value_iterator<type>(0, value);}
