#line 1 "verify/acted_monoid/range_bitwise_and_or_xor_range_sum.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/aplusb"
#include<algorithm>
#include<cassert>
#include<cstdint>
#include<iostream>
#include<limits>
#include<vector>#line 1 "acted_monoid/concept.hpp"
#include<concepts>namespacem1une{namespaceacted_monoid{// Concept defining the requirements for an Acted Monoid.template<typenameAM>conceptIsActedMonoid=requires(typenameAM::value_typea,typenameAM::value_typeb,typenameAM::operator_typef,typenameAM::operator_typeg){// 1. Value MonoidtypenameAM::value_type;{AM::id()}->std::same_as<typenameAM::value_type>;{AM::op(a,b)}->std::same_as<typenameAM::value_type>;// 2. Operator MonoidtypenameAM::operator_type;{AM::op_id()}->std::same_as<typenameAM::operator_type>;{AM::op_comp(f,g)}->std::same_as<typenameAM::operator_type>;// Composition order: f(g(x))// 3. Mapping: Operator x Value -> Value{AM::mapping(f,a)}->std::same_as<typenameAM::value_type>;};// Concept for acted monoids whose value monoid is a commutative group.// The value operation must obey commutativity and inverse laws.template<typenameAM>conceptIsCommutativeActedGroup=IsActedMonoid<AM>&&requires(typenameAM::value_typea){{AM::inv(a)}->std::same_as<typenameAM::value_type>;};}// namespace acted_monoid}// namespace m1une#line 1 "acted_monoid/range_bitwise_and_or_xor_range_sum.hpp"
#include<array>
#line 6 "acted_monoid/range_bitwise_and_or_xor_range_sum.hpp"
#include<type_traits>namespacem1une{namespaceacted_monoid{template<typenameT,intBITS>structRangeBitwiseAndOrXorRangeSumNode{Tsum;std::array<longlong,BITS>bit_count;longlongsize;};// Acted monoid for range bitwise AND, OR, and XOR updates and range sum queries.template<typenameT,intBITS=30>structRangeBitwiseAndOrXorRangeSum{static_assert(std::is_integral_v<T>&&!std::is_same_v<std::remove_cv_t<T>,bool>);static_assert(0<BITS&&BITS<=std::numeric_limits<T>::digits);usingvalue_type=RangeBitwiseAndOrXorRangeSumNode<T,BITS>;// Represents f(x) = (x & and_mask) ^ xor_mask on the lowest BITS bits.structoperator_type{Tand_mask;Txor_mask;};staticconstexprboolcommutative=true;staticconstexprbooloperator_commutative=false;staticconstexprTbit_mask(){ifconstexpr(std::is_unsigned_v<T>&&BITS==std::numeric_limits<T>::digits){return~T(0);}else{return(T(1)<<(BITS-1))|((T(1)<<(BITS-1))-1);}}staticconstexprvalue_typeid(){value_typeres;res.sum=T(0);res.bit_count.fill(0);res.size=0;returnres;}staticconstexprvalue_typeop(constvalue_type&a,constvalue_type&b){value_typeres;res.sum=a.sum+b.sum;res.size=a.size+b.size;for(inti=0;i<BITS;++i){res.bit_count[i]=a.bit_count[i]+b.bit_count[i];}returnres;}staticconstexproperator_typeop_id(){return{bit_mask(),T(0)};}// Returns f(g(x)).staticconstexproperator_typeop_comp(constoperator_type&f,constoperator_type&g){return{f.and_mask&g.and_mask,(g.xor_mask&f.and_mask)^f.xor_mask};}staticconstexprvalue_typemapping(constoperator_type&f,constvalue_type&x){value_typeres=x;res.sum=T(0);for(inti=0;i<BITS;++i){longlongcount=((f.and_mask>>i)&T(1))?x.bit_count[i]:0;if((f.xor_mask>>i)&T(1))count=x.size-count;res.bit_count[i]=count;res.sum+=static_cast<T>(count)*(T(1)<<i);}returnres;}staticconstexprvalue_typemake(constT&value){value_typeres;res.sum=value;res.size=1;for(inti=0;i<BITS;++i){res.bit_count[i]=(value>>i)&T(1);}returnres;}staticconstexproperator_typemake_and(constT&mask){return{mask&bit_mask(),T(0)};}staticconstexproperator_typemake_or(constT&mask){Tnormalized=mask&bit_mask();return{bit_mask()^normalized,normalized};}staticconstexproperator_typemake_xor(constT&mask){return{bit_mask(),mask&bit_mask()};}};}// namespace acted_monoid}// namespace m1une#line 1 "ds/segtree/lazy_segtree.hpp"
#include<bit>
#line 7 "ds/segtree/lazy_segtree.hpp"
#include<utility>
#line 9 "ds/segtree/lazy_segtree.hpp"
#line 1 "math/bit_ceil.hpp"
namespacem1une{namespacemath{template<typenameT>constexprTbit_ceil(Tn){if(n<=1)return1;Tx=1;while(x<n)x<<=1;returnx;}}// namespace math}// namespace m1une#line 12 "ds/segtree/lazy_segtree.hpp"
namespacem1une{namespaceds{// A highly generic Lazy Segment Tree utilizing C++20 Concepts for type safety.// It operates on any Acted Monoid structure satisfying the `m1une::acted_monoid::IsActedMonoid` concept.template<m1une::acted_monoid::IsActedMonoidActedMonoid>structLazySegtree{usingT=typenameActedMonoid::value_type;usingF=typenameActedMonoid::operator_type;private:int_n,_size,_log;std::vector<T>_d;std::vector<F>_lz;// Recalculates the value of the node k from its children.voidupdate(intk){_d[k]=ActedMonoid::op(_d[2*k],_d[2*k+1]);}staticTmapping_at(constF&f,constT&value,longlongord){ifconstexpr(requires(Fg,Tx,longlongi){ActedMonoid::mapping(g,x,i);}){returnActedMonoid::mapping(f,value,ord);}else{returnActedMonoid::mapping(f,value);}}staticFshift_operator(constF&f,longlongord){ifconstexpr(requires(Fg,longlongi){ActedMonoid::op_shift(g,i);}){returnActedMonoid::op_shift(f,ord);}else{returnf;}}intnode_length(intk)const{intlevel=std::bit_width((unsignedint)k)-1;return_size>>level;}intnode_left(intk)const{intlevel=std::bit_width((unsignedint)k)-1;intlen=_size>>level;return(k-(1<<level))*len;}// Applies the operator f to the node k and updates its lazy tag if it's an internal node.voidall_apply(intk,Ff){_d[k]=mapping_at(f,_d[k],0);if(k<_size){_lz[k]=ActedMonoid::op_comp(f,_lz[k]);}}// Propagates the lazy tag of the node k down to its children.voidpush(intk){all_apply(2*k,_lz[k]);all_apply(2*k+1,shift_operator(_lz[k],node_length(k)/2));_lz[k]=ActedMonoid::op_id();}public:// Constructs an empty lazy segment tree.LazySegtree():LazySegtree(0){}// Constructs a lazy segment tree of size `n`, initialized with the identity element.explicitLazySegtree(intn):LazySegtree(std::vector<T>(n,ActedMonoid::id())){}// Constructs a lazy segment tree from an existing vector.explicitLazySegtree(conststd::vector<T>&v):_n(int(v.size())){_size=m1une::math::bit_ceil((unsignedint)(_n));_log=0;while((1U<<_log)<(unsignedint)(_size))_log++;_d.assign(2*_size,ActedMonoid::id());_lz.assign(_size,ActedMonoid::op_id());for(inti=0;i<_n;i++)_d[_size+i]=v[i];for(inti=_size-1;i>=1;i--)update(i);}explicitLazySegtree(std::vector<T>&&v):_n(int(v.size())){_size=m1une::math::bit_ceil((unsignedint)(_n));_log=0;while((1U<<_log)<(unsignedint)(_size))_log++;_d.assign(2*_size,ActedMonoid::id());_lz.assign(_size,ActedMonoid::op_id());for(inti=0;i<_n;i++)_d[_size+i]=std::move(v[i]);for(inti=_size-1;i>=1;i--)update(i);}// Constructs a lazy segment tree from a vector of a different type U.// It automatically adapts to the Monoid's initialization requirements:// 1. ActedMonoid::make(val) if it exists.// 2. ActedMonoid::make(val, index) if the monoid requires global indices.// 3. static_cast<T>(val) as a fallback for simple monoids.template<typenameU>requires(!std::same_as<U,T>)&&(requires(Ux){ActedMonoid::make(x);}||requires(Ux,inti){ActedMonoid::make(x,i);}||std::convertible_to<U,T>)explicitLazySegtree(conststd::vector<U>&v):_n(int(v.size())){_size=m1une::math::bit_ceil((unsignedint)(_n));_log=0;while((1U<<_log)<(unsignedint)(_size))_log++;_d.assign(2*_size,ActedMonoid::id());_lz.assign(_size,ActedMonoid::op_id());for(inti=0;i<_n;i++){ifconstexpr(requires(Ux){ActedMonoid::make(x);}){_d[_size+i]=ActedMonoid::make(v[i]);}elseifconstexpr(requires(Ux,intidx){ActedMonoid::make(x,idx);}){_d[_size+i]=ActedMonoid::make(v[i],i);}else{_d[_size+i]=static_cast<T>(v[i]);}}for(inti=_size-1;i>=1;i--)update(i);}// Returns the number of elements.intsize()const{return_n;}// Returns whether the tree is empty.boolempty()const{return_n==0;}// Assigns x to the p-th element.voidset(intp,Tx){assert(0<=p&&p<_n);p+=_size;for(inti=_log;i>=1;i--)push(p>>i);_d[p]=x;for(inti=1;i<=_log;i++)update(p>>i);}// Returns the value of the p-th element.Tget(intp){assert(0<=p&&p<_n);p+=_size;for(inti=_log;i>=1;i--)push(p>>i);return_d[p];}// Returns the value of the p-th element.Toperator[](intp){returnget(p);}// Returns the product (result of the monoid operation) in the range [l, r).Tprod(intl,intr){assert(0<=l&&l<=r&&r<=_n);if(l==r)returnActedMonoid::id();l+=_size;r+=_size;for(inti=_log;i>=1;i--){if(((l>>i)<<i)!=l)push(l>>i);if(((r>>i)<<i)!=r)push((r-1)>>i);}Tsml=ActedMonoid::id(),smr=ActedMonoid::id();while(l<r){if(l&1)sml=ActedMonoid::op(sml,_d[l++]);if(r&1)smr=ActedMonoid::op(_d[--r],smr);l>>=1;r>>=1;}returnActedMonoid::op(sml,smr);}// Returns the product of the entire array.Tall_prod()const{return_d[1];}// Returns all elements as a vector.std::vector<T>to_vector(){for(intk=1;k<_size;k++)push(k);std::vector<T>res;res.reserve(_n);for(inti=0;i<_n;i++)res.push_back(_d[_size+i]);returnres;}// Returns the elements in the range [l, r) as a vector.std::vector<T>to_vector(intl,intr){assert(0<=l&&l<=r&&r<=_n);std::vector<T>res;res.reserve(r-l);for(inti=l;i<r;i++)res.push_back(get(i));returnres;}// Applies the operator f to the p-th element.voidapply(intp,Ff){assert(0<=p&&p<_n);p+=_size;for(inti=_log;i>=1;i--)push(p>>i);_d[p]=mapping_at(f,_d[p],0);for(inti=1;i<=_log;i++)update(p>>i);}// Applies the operator f to all elements in the range [l, r).voidapply(intl,intr,Ff){assert(0<=l&&l<=r&&r<=_n);if(l==r)return;intbase_l=l;l+=_size;r+=_size;for(inti=_log;i>=1;i--){if(((l>>i)<<i)!=l)push(l>>i);if(((r>>i)<<i)!=r)push((r-1)>>i);}{intl2=l,r2=r;while(l<r){if(l&1){all_apply(l,shift_operator(f,node_left(l)-base_l));l++;}if(r&1){--r;all_apply(r,shift_operator(f,node_left(r)-base_l));}l>>=1;r>>=1;}l=l2;r=r2;}for(inti=1;i<=_log;i++){if(((l>>i)<<i)!=l)update(l>>i);if(((r>>i)<<i)!=r)update((r-1)>>i);}}// Finds the largest r such that g(prod(l, r)) is true.template<classF_pred>intmax_right(intl,F_predg){assert(0<=l&&l<=_n);assert(g(ActedMonoid::id()));if(l==_n)return_n;l+=_size;for(inti=_log;i>=1;i--)push(l>>i);Tsm=ActedMonoid::id();do{while(l%2==0)l>>=1;if(!g(ActedMonoid::op(sm,_d[l]))){while(l<_size){push(l);l=(2*l);if(g(ActedMonoid::op(sm,_d[l]))){sm=ActedMonoid::op(sm,_d[l]);l++;}}returnl-_size;}sm=ActedMonoid::op(sm,_d[l]);l++;}while((l&-l)!=l);return_n;}// Finds the smallest l such that g(prod(l, r)) is true.template<classF_pred>intmin_left(intr,F_predg){assert(0<=r&&r<=_n);assert(g(ActedMonoid::id()));if(r==0)return0;r+=_size;for(inti=_log;i>=1;i--)push((r-1)>>i);Tsm=ActedMonoid::id();do{r--;while(r>1&&(r%2))r>>=1;if(!g(ActedMonoid::op(_d[r],sm))){while(r<_size){push(r);r=(2*r+1);if(g(ActedMonoid::op(_d[r],sm))){sm=ActedMonoid::op(_d[r],sm);r--;}}returnr+1-_size;}sm=ActedMonoid::op(_d[r],sm);}while((r&-r)!=r);return0;}};}// namespace ds}// namespace m1une#line 13 "verify/acted_monoid/range_bitwise_and_or_xor_range_sum.test.cpp"
namespace{usingAM=m1une::acted_monoid::RangeBitwiseAndOrXorRangeSum<longlong,10>;usingSignedFullWidth=m1une::acted_monoid::RangeBitwiseAndOrXorRangeSum<longlong,63>;usingUnsignedFullWidth=m1une::acted_monoid::RangeBitwiseAndOrXorRangeSum<unsignedlonglong,64>;longlongapply_scalar(constAM::operator_type&f,longlongx){return(x&f.and_mask)^f.xor_mask;}voidtest_composition(){std::vector<AM::operator_type>operators;for(longlongmask=0;mask<32;++mask){operators.push_back(AM::make_and(mask));operators.push_back(AM::make_or(mask));operators.push_back(AM::make_xor(mask));}for(constauto&f:operators){for(constauto&g:operators){autocomposition=AM::op_comp(f,g);for(longlongx=0;x<32;++x){assert(apply_scalar(composition,x)==apply_scalar(f,apply_scalar(g,x)));}}}}voidtest_randomized(){constexprintn=73;constexprlonglongmask=(1LL<<10)-1;std::uint64_tstate=123456789;autorandom=[&state](){state^=state<<7;state^=state>>9;returnstate;};std::vector<longlong>values(n);for(longlong&value:values)value=static_cast<longlong>(random()&mask);m1une::ds::LazySegtree<AM>seg(values);for(intstep=0;step<5000;++step){intl=static_cast<int>(random()%(n+1));intr=static_cast<int>(random()%(n+1));if(r<l)std::swap(l,r);if(random()%4!=0){longlongoperand=static_cast<longlong>(random()&mask);inttype=static_cast<int>(random()%3);AM::operator_typef=AM::op_id();if(type==0){f=AM::make_and(operand);for(inti=l;i<r;++i)values[i]&=operand;}elseif(type==1){f=AM::make_or(operand);for(inti=l;i<r;++i)values[i]|=operand;}else{f=AM::make_xor(operand);for(inti=l;i<r;++i)values[i]^=operand;}seg.apply(l,r,f);}else{longlongexpected=0;for(inti=l;i<r;++i)expected+=values[i];assert(seg.prod(l,r).sum==expected);}intindex=static_cast<int>(random()%n);assert(seg.get(index).sum==values[index]);}}static_assert(m1une::acted_monoid::IsActedMonoid<AM>);static_assert(AM::commutative);static_assert(!AM::operator_commutative);static_assert(SignedFullWidth::bit_mask()==std::numeric_limits<longlong>::max());static_assert(UnsignedFullWidth::bit_mask()==std::numeric_limits<unsignedlonglong>::max());}// namespaceintmain(){test_composition();test_randomized();longlonga,b;std::cin>>a>>b;std::cout<<a+b<<'\n';}