#include #include namespace mozilla { template struct IteratorTraits { typedef typename Iterator::ValueType ValueType; }; template struct IteratorTraits { typedef T ValueType; }; template struct IteratorTraits { typedef const T ValueType; }; } // namespace mozilla namespace mozilla { template class ReverseIterator { public: typedef typename IteratorTraits::ValueType ValueType; template explicit ReverseIterator(Iterator aIter) : mCurrent(aIter) { } template ReverseIterator(const ReverseIterator& aOther) : mCurrent(aOther.mCurrent) { } ValueType& operator*() const { IteratorT tmp = mCurrent; return *--tmp; } /* Increments and decrements operators */ ReverseIterator& operator++() { --mCurrent; return *this; } ReverseIterator& operator--() { ++mCurrent; return *this; } ReverseIterator operator++(int) { auto ret = *this; mCurrent--; return ret; } ReverseIterator operator--(int) { auto ret = *this; mCurrent++; return ret; } /* Comparison operators */ template friend bool operator==(const ReverseIterator& aIter1, const ReverseIterator& aIter2); template friend bool operator!=(const ReverseIterator& aIter1, const ReverseIterator& aIter2); private: IteratorT mCurrent; }; template bool operator==(const ReverseIterator& aIter1, const ReverseIterator& aIter2) { return aIter1.mCurrent == aIter2.mCurrent; } template bool operator!=(const ReverseIterator& aIter1, const ReverseIterator& aIter2) { return aIter1.mCurrent != aIter2.mCurrent; } namespace detail { template class IteratorRange { public: typedef IteratorT iterator; typedef IteratorT const_iterator; typedef ReverseIterator reverse_iterator; typedef ReverseIterator const_reverse_iterator; template IteratorRange(Iterator1 aIterBegin, Iterator2 aIterEnd) : mIterBegin(aIterBegin), mIterEnd(aIterEnd) { } template IteratorRange(const IteratorRange& aOther) : mIterBegin(aOther.mIterBegin), mIterEnd(aOther.mIterEnd) { } iterator begin() const { return mIterBegin; } const_iterator cbegin() const { return begin(); } iterator end() const { return mIterEnd; } const_iterator cend() const { return end(); } reverse_iterator rbegin() const { return reverse_iterator(mIterEnd); } const_reverse_iterator crbegin() const { return rbegin(); } reverse_iterator rend() const { return reverse_iterator(mIterBegin); } const_reverse_iterator crend() const { return rend(); } private: IteratorT mIterBegin; IteratorT mIterEnd; }; } // namespace detail template detail::IteratorRange Reversed(Range& aRange) { return {aRange.rbegin(), aRange.rend()}; } template detail::IteratorRange Reversed(const Range& aRange) { return {aRange.rbegin(), aRange.rend()}; } } // namespace mozilla namespace mozilla { namespace detail { template class IntegerIterator { public: typedef const IntTypeT ValueType; template explicit IntegerIterator(IntType aCurrent) : mCurrent(aCurrent) { } template IntegerIterator(const IntegerIterator& aOther) : mCurrent(aOther.mCurrent) { } // Since operator* is required to return a reference, we return // a reference to our member here. const IntTypeT& operator*() const { return mCurrent; } /* Increment and decrement operators */ IntegerIterator& operator++() { ++mCurrent; return *this; } IntegerIterator& operator--() { --mCurrent; return *this; } IntegerIterator operator++(int) { auto ret = *this; ++mCurrent; return ret; } IntegerIterator operator--(int) { auto ret = *this; --mCurrent; return ret; } /* Comparison operators */ template friend bool operator==(const IntegerIterator& aIter1, const IntegerIterator& aIter2); template friend bool operator!=(const IntegerIterator& aIter1, const IntegerIterator& aIter2); private: IntTypeT mCurrent; }; template bool operator==(const IntegerIterator& aIter1, const IntegerIterator& aIter2) { return aIter1.mCurrent == aIter2.mCurrent; } template bool operator!=(const IntegerIterator& aIter1, const IntegerIterator& aIter2) { return aIter1.mCurrent != aIter2.mCurrent; } template class IntegerRange { public: typedef IntegerIterator iterator; typedef IntegerIterator const_iterator; typedef ReverseIterator> reverse_iterator; typedef ReverseIterator> const_reverse_iterator; template explicit IntegerRange(IntType aEnd) : mBegin(0), mEnd(aEnd) { } template IntegerRange(IntType1 aBegin, IntType2 aEnd) : mBegin(aBegin), mEnd(aEnd) { } iterator begin() const { return iterator(mBegin); } const_iterator cbegin() const { return begin(); } iterator end() const { return iterator(mEnd); } const_iterator cend() const { return end(); } reverse_iterator rbegin() const { return reverse_iterator(mEnd); } const_reverse_iterator crbegin() const { return rbegin(); } reverse_iterator rend() const { return reverse_iterator(mBegin); } const_reverse_iterator crend() const { return rend(); } private: IntTypeT mBegin; IntTypeT mEnd; }; } // namespace detail template detail::IntegerRange MakeRange(IntType aEnd) { return detail::IntegerRange(aEnd); } template detail::IntegerRange MakeRange(IntType1 aBegin, IntType2 aEnd) { return detail::IntegerRange(aBegin, aEnd); } } // namespace mozilla using namespace mozilla; int main() { size_t n; std::cin >> n; for (auto i : Reversed(MakeRange(n))) { std::cout << i << std::endl; } }