#pragma once
// This file is a fork of AtCoder Library.#define E6NLAQ_FENWICKTREE_HPP
#include<cassert>
#include<vector>#include"internal/type_traits.hpp"namespacee6nlaq{// Reference: https://en.wikipedia.org/wiki/Fenwick_treetemplate<classT>structfenwick_tree{usingU=internal::to_unsigned_t<T>;public:fenwick_tree():_n(0){}explicitfenwick_tree(intn):_n(n),data(n){}voidadd(intp,Tx){assert(0<=p&&p<_n);p++;while(p<=_n){data[p-1]+=U(x);p+=p&-p;}}Tsum(intl,intr){assert(0<=l&&l<=r&&r<=_n);returnsum(r)-sum(l);}private:int_n;std::vector<U>data;Usum(intr){Us=0;while(r>0){s+=data[r-1];r-=r&-r;}returns;}};}// namespace e6nlaq
#line 2 "include/e6nlaq/fenwicktree.hpp"
// This file is a fork of AtCoder Library.#define E6NLAQ_FENWICKTREE_HPP
#include<cassert>
#include<vector>#line 2 "include/e6nlaq/internal/type_traits.hpp"
// This file is a fork of AtCoder Library.#define E6NLAQ_INTERNAL_TYPE_TRAITS_HPP
#line 8 "include/e6nlaq/internal/type_traits.hpp"
#include<type_traits>namespacee6nlaq{namespaceinternal{#ifndef _MSC_VER
template<classT>usingis_signed_int128=typenamestd::conditional<std::is_same<T,__int128_t>::value||std::is_same<T,__int128>::value,std::true_type,std::false_type>::type;template<classT>usingis_unsigned_int128=typenamestd::conditional<std::is_same<T,__uint128_t>::value||std::is_same<T,unsigned__int128>::value,std::true_type,std::false_type>::type;template<classT>usingmake_unsigned_int128=typenamestd::conditional<std::is_same<T,__int128_t>::value,__uint128_t,unsigned__int128>;template<classT>usingis_integral=typenamestd::conditional<std::is_integral<T>::value||is_signed_int128<T>::value||is_unsigned_int128<T>::value,std::true_type,std::false_type>::type;template<classT>usingis_signed_int=typenamestd::conditional<(is_integral<T>::value&&std::is_signed<T>::value)||is_signed_int128<T>::value,std::true_type,std::false_type>::type;template<classT>usingis_unsigned_int=typenamestd::conditional<(is_integral<T>::value&&std::is_unsigned<T>::value)||is_unsigned_int128<T>::value,std::true_type,std::false_type>::type;template<classT>usingto_unsigned=typenamestd::conditional<is_signed_int128<T>::value,make_unsigned_int128<T>,typenamestd::conditional<std::is_signed<T>::value,std::make_unsigned<T>,std::common_type<T>>::type>::type;#else
template<classT>usingis_integral=typenamestd::is_integral<T>;template<classT>usingis_signed_int=typenamestd::conditional<is_integral<T>::value&&std::is_signed<T>::value,std::true_type,std::false_type>::type;template<classT>usingis_unsigned_int=typenamestd::conditional<is_integral<T>::value&&std::is_unsigned<T>::value,std::true_type,std::false_type>::type;template<classT>usingto_unsigned=typenamestd::conditional<is_signed_int<T>::value,std::make_unsigned<T>,std::common_type<T>>::type;#endif
template<classT>usingis_signed_int_t=std::enable_if_t<is_signed_int<T>::value>;template<classT>usingis_unsigned_int_t=std::enable_if_t<is_unsigned_int<T>::value>;template<classT>usingto_unsigned_t=typenameto_unsigned<T>::type;}// namespace internal}// namespace e6nlaq#line 11 "include/e6nlaq/fenwicktree.hpp"
namespacee6nlaq{// Reference: https://en.wikipedia.org/wiki/Fenwick_treetemplate<classT>structfenwick_tree{usingU=internal::to_unsigned_t<T>;public:fenwick_tree():_n(0){}explicitfenwick_tree(intn):_n(n),data(n){}voidadd(intp,Tx){assert(0<=p&&p<_n);p++;while(p<=_n){data[p-1]+=U(x);p+=p&-p;}}Tsum(intl,intr){assert(0<=l&&l<=r&&r<=_n);returnsum(r)-sum(l);}private:int_n;std::vector<U>data;Usum(intr){Us=0;while(r>0){s+=data[r-1];r-=r&-r;}returns;}};}// namespace e6nlaq