This documentation is automatically generated by online-judge-tools/verification-helper
#ifndef _LIB_VECTOR_N
#define _LIB_VECTOR_N
#include <bits/stdc++.h>
#include "Traits.cpp"
#define VEC_CONST_OP(op, typ) \
type operator op(const typ rhs) const { \
auto res = *this; \
return res op##= rhs; \
}
#define VEC_BIN_OP(op) \
type& operator op##=(const type& rhs) { \
if(rhs.size() > this->size()) \
this->resize(rhs.size()); \
int sz = this->size(); \
for(int i = 0; i < (int)rhs.size(); i++) \
(*this)[i] op##= rhs[i]; \
for(int i = rhs.size(); i < sz; i++) \
(*this)[i] op##= 0; \
return *this; \
} \
VEC_CONST_OP(op, type)
#define VEC_SINGLE_OP(op, typ) \
type& operator op##=(const typ rhs) { \
for(auto& x : *this) \
x op##= rhs; \
return *this; \
} \
VEC_CONST_OP(op, typ)
namespace lib {
using namespace std;
template<typename T>
struct VectorN : vector<T> {
using type = VectorN<T>;
template <
typename Container,
typename enable_if<traits::HasInputIterator<Container>::value>::type * = nullptr>
VectorN(const Container &container)
: vector<T>(container.begin(), container.end()) {}
VectorN(const initializer_list<T> &v)
: vector<T>(v.begin(), v.end()) {}
template<typename... Args>
VectorN( Args&&... args )
: vector<T>(std::forward<Args>(args)...) {}
VEC_BIN_OP(+)
VEC_BIN_OP(-)
VEC_BIN_OP(*)
VEC_SINGLE_OP(+, T&)
VEC_SINGLE_OP(-, T&)
VEC_SINGLE_OP(*, T&)
VEC_SINGLE_OP(/, T&)
VEC_SINGLE_OP(^, int64_t)
type operator-() const {
auto res = *this;
for(auto& x : res) x = -x;
return res;
}
type operator%(int n) const {
// TODO: get rid of this
// return *const_cast<type*>(this);
return *this;
}
};
} // namespace lib
#endif#line 1 "VectorN.cpp"
#include <bits/stdc++.h>
#line 1 "Traits.cpp"
#line 4 "Traits.cpp"
namespace lib {
using namespace std;
namespace traits {
template <typename...> struct make_void { using type = void; };
template <typename... T> using void_t = typename make_void<T...>::type;
/// keep caide
template <typename Iterator>
using IteratorCategory = typename iterator_traits<Iterator>::iterator_category;
/// keep caide
template <typename Container>
using IteratorCategoryOf = IteratorCategory<typename Container::iterator>;
/// keep caide
template <typename Iterator>
using IteratorValue = typename iterator_traits<Iterator>::value_type;
/// keep caide
template <typename Container>
using IteratorValueOf = IteratorValue<typename Container::iterator>;
/// keep caide
template <typename Iterator>
using IsRandomIterator =
is_base_of<random_access_iterator_tag, IteratorCategory<Iterator>>;
/// keep caide
template <typename Iterator>
using IsInputIterator =
is_base_of<input_iterator_tag, IteratorCategory<Iterator>>;
/// keep caide
template <typename Iterator>
using IsBidirectionalIterator =
is_base_of<bidirectional_iterator_tag, IteratorCategory<Iterator>>;
/// keep caide
template <typename Container>
using HasRandomIterator =
is_base_of<random_access_iterator_tag, IteratorCategoryOf<Container>>;
/// keep caide
template <typename Container>
using HasInputIterator =
is_base_of<input_iterator_tag, IteratorCategoryOf<Container>>;
/// keep caide
template <typename Container>
using HasBidirectionalIterator =
is_base_of<bidirectional_iterator_tag, IteratorCategoryOf<Container>>;
} // namespace traits
} // namespace lib
#line 5 "VectorN.cpp"
#define VEC_CONST_OP(op, typ) \
type operator op(const typ rhs) const { \
auto res = *this; \
return res op##= rhs; \
}
#define VEC_BIN_OP(op) \
type& operator op##=(const type& rhs) { \
if(rhs.size() > this->size()) \
this->resize(rhs.size()); \
int sz = this->size(); \
for(int i = 0; i < (int)rhs.size(); i++) \
(*this)[i] op##= rhs[i]; \
for(int i = rhs.size(); i < sz; i++) \
(*this)[i] op##= 0; \
return *this; \
} \
VEC_CONST_OP(op, type)
#define VEC_SINGLE_OP(op, typ) \
type& operator op##=(const typ rhs) { \
for(auto& x : *this) \
x op##= rhs; \
return *this; \
} \
VEC_CONST_OP(op, typ)
namespace lib {
using namespace std;
template<typename T>
struct VectorN : vector<T> {
using type = VectorN<T>;
template <
typename Container,
typename enable_if<traits::HasInputIterator<Container>::value>::type * = nullptr>
VectorN(const Container &container)
: vector<T>(container.begin(), container.end()) {}
VectorN(const initializer_list<T> &v)
: vector<T>(v.begin(), v.end()) {}
template<typename... Args>
VectorN( Args&&... args )
: vector<T>(std::forward<Args>(args)...) {}
VEC_BIN_OP(+)
VEC_BIN_OP(-)
VEC_BIN_OP(*)
VEC_SINGLE_OP(+, T&)
VEC_SINGLE_OP(-, T&)
VEC_SINGLE_OP(*, T&)
VEC_SINGLE_OP(/, T&)
VEC_SINGLE_OP(^, int64_t)
type operator-() const {
auto res = *this;
for(auto& x : res) x = -x;
return res;
}
type operator%(int n) const {
// TODO: get rid of this
// return *const_cast<type*>(this);
return *this;
}
};
} // namespace lib