#pragma once
#include<algorithm>
#include<cassert>
#include<limits>
#include<vector>namespacehaar_lib{classsegment_tree_beats{public:usingvalue_type=int64_t;private:intdepth_,size_,hsize_;std::vector<value_type>fst_max_,snd_max_;std::vector<int>max_count_;std::vector<value_type>fst_min_,snd_min_;std::vector<int>min_count_;std::vector<value_type>sum_,lazy_add_;public:segment_tree_beats(){}segment_tree_beats(intn):depth_(n>1?32-__builtin_clz(n-1)+1:1),size_(1<<depth_),hsize_(size_/2),fst_max_(size_,std::numeric_limits<value_type>::min()),snd_max_(size_,std::numeric_limits<value_type>::min()),max_count_(size_,0),fst_min_(size_,std::numeric_limits<value_type>::max()),snd_min_(size_,std::numeric_limits<value_type>::max()),min_count_(size_,0),sum_(size_,0),lazy_add_(size_,0){}private:intlc(inti)const{returni<<1|0;}// left childintrc(inti)const{returni<<1|1;}// right childvoidupdate_node_max(inti,value_typex){sum_[i]+=(x-fst_max_[i])*max_count_[i];if(fst_max_[i]==fst_min_[i])fst_max_[i]=fst_min_[i]=x;elseif(fst_max_[i]==snd_min_[i])fst_max_[i]=snd_min_[i]=x;elsefst_max_[i]=x;}voidupdate_node_min(inti,value_typex){sum_[i]+=(x-fst_min_[i])*min_count_[i];if(fst_max_[i]==fst_min_[i])fst_max_[i]=fst_min_[i]=x;elseif(snd_max_[i]==fst_min_[i])snd_max_[i]=fst_min_[i]=x;elsefst_min_[i]=x;}voidupdate_node_add(inti,value_typex){constintlen=hsize_>>(31-__builtin_clz(i));sum_[i]+=x*len;fst_max_[i]+=x;if(snd_max_[i]!=std::numeric_limits<value_type>::min())snd_max_[i]+=x;fst_min_[i]+=x;if(snd_min_[i]!=std::numeric_limits<value_type>::max())snd_min_[i]+=x;lazy_add_[i]+=x;}voidpropagate(inti){if(i>=hsize_)return;if(lazy_add_[i]!=0){update_node_add(lc(i),lazy_add_[i]);update_node_add(rc(i),lazy_add_[i]);lazy_add_[i]=0;}if(fst_max_[i]<fst_max_[lc(i)])update_node_max(lc(i),fst_max_[i]);if(fst_min_[i]>fst_min_[lc(i)])update_node_min(lc(i),fst_min_[i]);if(fst_max_[i]<fst_max_[rc(i)])update_node_max(rc(i),fst_max_[i]);if(fst_min_[i]>fst_min_[rc(i)])update_node_min(rc(i),fst_min_[i]);}voidbottom_up(inti){constintL=lc(i);constintR=rc(i);sum_[i]=sum_[L]+sum_[R];fst_max_[i]=std::max(fst_max_[L],fst_max_[R]);if(fst_max_[L]<fst_max_[R]){max_count_[i]=max_count_[R];snd_max_[i]=std::max(fst_max_[L],snd_max_[R]);}elseif(fst_max_[L]>fst_max_[R]){max_count_[i]=max_count_[L];snd_max_[i]=std::max(snd_max_[L],fst_max_[R]);}else{max_count_[i]=max_count_[L]+max_count_[R];snd_max_[i]=std::max(snd_max_[L],snd_max_[R]);}fst_min_[i]=std::min(fst_min_[L],fst_min_[R]);if(fst_min_[L]>fst_min_[R]){min_count_[i]=min_count_[R];snd_min_[i]=std::min(fst_min_[L],snd_min_[R]);}elseif(fst_min_[L]<fst_min_[R]){min_count_[i]=min_count_[L];snd_min_[i]=std::min(snd_min_[L],fst_min_[R]);}else{min_count_[i]=min_count_[L]+min_count_[R];snd_min_[i]=std::min(snd_min_[L],snd_min_[R]);}}private:voidchmin(inti,intl,intr,ints,intt,value_typex){if(r<=sort<=lorfst_max_[i]<=x)return;if(s<=landr<=tandsnd_max_[i]<x){update_node_max(i,x);return;}propagate(i);chmin(lc(i),l,(l+r)/2,s,t,x);chmin(rc(i),(l+r)/2,r,s,t,x);bottom_up(i);}public:voidchmin(intl,intr,value_typex){assert(0<=landl<=randr<=hsize_);chmin(1,0,hsize_,l,r,x);}private:voidchmax(inti,intl,intr,ints,intt,value_typex){if(r<=sort<=lorfst_min_[i]>=x)return;if(s<=landr<=tandsnd_min_[i]>x){update_node_min(i,x);return;}propagate(i);chmax(lc(i),l,(l+r)/2,s,t,x);chmax(rc(i),(l+r)/2,r,s,t,x);bottom_up(i);}public:voidchmax(intl,intr,value_typex){assert(0<=landl<=randr<=hsize_);chmax(1,0,hsize_,l,r,x);}private:voidadd(inti,intl,intr,ints,intt,value_typex){if(r<=sort<=l)return;if(s<=landr<=t){update_node_add(i,x);return;}propagate(i);add(lc(i),l,(l+r)/2,s,t,x);add(rc(i),(l+r)/2,r,s,t,x);bottom_up(i);}public:voidadd(intl,intr,value_typex){assert(0<=landl<=randr<=hsize_);add(1,0,hsize_,l,r,x);}private:value_typeget_sum(inti,intl,intr,ints,intt){if(r<=sort<=l)return0;if(s<=landr<=t)returnsum_[i];propagate(i);returnget_sum(lc(i),l,(l+r)/2,s,t)+get_sum(rc(i),(l+r)/2,r,s,t);}public:value_typeget_sum(intl,intr){assert(0<=landl<=randr<=hsize_);returnget_sum(1,0,hsize_,l,r);}public:voidinit_with_vector(conststd::vector<value_type>&v){fst_max_.assign(size_,std::numeric_limits<value_type>::min());snd_max_.assign(size_,std::numeric_limits<value_type>::min());max_count_.assign(size_,1);fst_min_.assign(size_,std::numeric_limits<value_type>::max());snd_min_.assign(size_,std::numeric_limits<value_type>::max());min_count_.assign(size_,1);sum_.assign(size_,0);lazy_add_.assign(size_,0);for(inti=0;i<(int)v.size();++i){fst_max_[hsize_+i]=v[i];max_count_[hsize_+i]=1;fst_min_[hsize_+i]=v[i];min_count_[hsize_+i]=1;sum_[hsize_+i]=v[i];}for(inti=hsize_;--i>=1;)bottom_up(i);}};}// namespace haar_lib
#line 2 "Mylib/DataStructure/SegmentTree/segment_tree_beats.cpp"
#include<algorithm>
#include<cassert>
#include<limits>
#include<vector>namespacehaar_lib{classsegment_tree_beats{public:usingvalue_type=int64_t;private:intdepth_,size_,hsize_;std::vector<value_type>fst_max_,snd_max_;std::vector<int>max_count_;std::vector<value_type>fst_min_,snd_min_;std::vector<int>min_count_;std::vector<value_type>sum_,lazy_add_;public:segment_tree_beats(){}segment_tree_beats(intn):depth_(n>1?32-__builtin_clz(n-1)+1:1),size_(1<<depth_),hsize_(size_/2),fst_max_(size_,std::numeric_limits<value_type>::min()),snd_max_(size_,std::numeric_limits<value_type>::min()),max_count_(size_,0),fst_min_(size_,std::numeric_limits<value_type>::max()),snd_min_(size_,std::numeric_limits<value_type>::max()),min_count_(size_,0),sum_(size_,0),lazy_add_(size_,0){}private:intlc(inti)const{returni<<1|0;}// left childintrc(inti)const{returni<<1|1;}// right childvoidupdate_node_max(inti,value_typex){sum_[i]+=(x-fst_max_[i])*max_count_[i];if(fst_max_[i]==fst_min_[i])fst_max_[i]=fst_min_[i]=x;elseif(fst_max_[i]==snd_min_[i])fst_max_[i]=snd_min_[i]=x;elsefst_max_[i]=x;}voidupdate_node_min(inti,value_typex){sum_[i]+=(x-fst_min_[i])*min_count_[i];if(fst_max_[i]==fst_min_[i])fst_max_[i]=fst_min_[i]=x;elseif(snd_max_[i]==fst_min_[i])snd_max_[i]=fst_min_[i]=x;elsefst_min_[i]=x;}voidupdate_node_add(inti,value_typex){constintlen=hsize_>>(31-__builtin_clz(i));sum_[i]+=x*len;fst_max_[i]+=x;if(snd_max_[i]!=std::numeric_limits<value_type>::min())snd_max_[i]+=x;fst_min_[i]+=x;if(snd_min_[i]!=std::numeric_limits<value_type>::max())snd_min_[i]+=x;lazy_add_[i]+=x;}voidpropagate(inti){if(i>=hsize_)return;if(lazy_add_[i]!=0){update_node_add(lc(i),lazy_add_[i]);update_node_add(rc(i),lazy_add_[i]);lazy_add_[i]=0;}if(fst_max_[i]<fst_max_[lc(i)])update_node_max(lc(i),fst_max_[i]);if(fst_min_[i]>fst_min_[lc(i)])update_node_min(lc(i),fst_min_[i]);if(fst_max_[i]<fst_max_[rc(i)])update_node_max(rc(i),fst_max_[i]);if(fst_min_[i]>fst_min_[rc(i)])update_node_min(rc(i),fst_min_[i]);}voidbottom_up(inti){constintL=lc(i);constintR=rc(i);sum_[i]=sum_[L]+sum_[R];fst_max_[i]=std::max(fst_max_[L],fst_max_[R]);if(fst_max_[L]<fst_max_[R]){max_count_[i]=max_count_[R];snd_max_[i]=std::max(fst_max_[L],snd_max_[R]);}elseif(fst_max_[L]>fst_max_[R]){max_count_[i]=max_count_[L];snd_max_[i]=std::max(snd_max_[L],fst_max_[R]);}else{max_count_[i]=max_count_[L]+max_count_[R];snd_max_[i]=std::max(snd_max_[L],snd_max_[R]);}fst_min_[i]=std::min(fst_min_[L],fst_min_[R]);if(fst_min_[L]>fst_min_[R]){min_count_[i]=min_count_[R];snd_min_[i]=std::min(fst_min_[L],snd_min_[R]);}elseif(fst_min_[L]<fst_min_[R]){min_count_[i]=min_count_[L];snd_min_[i]=std::min(snd_min_[L],fst_min_[R]);}else{min_count_[i]=min_count_[L]+min_count_[R];snd_min_[i]=std::min(snd_min_[L],snd_min_[R]);}}private:voidchmin(inti,intl,intr,ints,intt,value_typex){if(r<=sort<=lorfst_max_[i]<=x)return;if(s<=landr<=tandsnd_max_[i]<x){update_node_max(i,x);return;}propagate(i);chmin(lc(i),l,(l+r)/2,s,t,x);chmin(rc(i),(l+r)/2,r,s,t,x);bottom_up(i);}public:voidchmin(intl,intr,value_typex){assert(0<=landl<=randr<=hsize_);chmin(1,0,hsize_,l,r,x);}private:voidchmax(inti,intl,intr,ints,intt,value_typex){if(r<=sort<=lorfst_min_[i]>=x)return;if(s<=landr<=tandsnd_min_[i]>x){update_node_min(i,x);return;}propagate(i);chmax(lc(i),l,(l+r)/2,s,t,x);chmax(rc(i),(l+r)/2,r,s,t,x);bottom_up(i);}public:voidchmax(intl,intr,value_typex){assert(0<=landl<=randr<=hsize_);chmax(1,0,hsize_,l,r,x);}private:voidadd(inti,intl,intr,ints,intt,value_typex){if(r<=sort<=l)return;if(s<=landr<=t){update_node_add(i,x);return;}propagate(i);add(lc(i),l,(l+r)/2,s,t,x);add(rc(i),(l+r)/2,r,s,t,x);bottom_up(i);}public:voidadd(intl,intr,value_typex){assert(0<=landl<=randr<=hsize_);add(1,0,hsize_,l,r,x);}private:value_typeget_sum(inti,intl,intr,ints,intt){if(r<=sort<=l)return0;if(s<=landr<=t)returnsum_[i];propagate(i);returnget_sum(lc(i),l,(l+r)/2,s,t)+get_sum(rc(i),(l+r)/2,r,s,t);}public:value_typeget_sum(intl,intr){assert(0<=landl<=randr<=hsize_);returnget_sum(1,0,hsize_,l,r);}public:voidinit_with_vector(conststd::vector<value_type>&v){fst_max_.assign(size_,std::numeric_limits<value_type>::min());snd_max_.assign(size_,std::numeric_limits<value_type>::min());max_count_.assign(size_,1);fst_min_.assign(size_,std::numeric_limits<value_type>::max());snd_min_.assign(size_,std::numeric_limits<value_type>::max());min_count_.assign(size_,1);sum_.assign(size_,0);lazy_add_.assign(size_,0);for(inti=0;i<(int)v.size();++i){fst_max_[hsize_+i]=v[i];max_count_[hsize_+i]=1;fst_min_[hsize_+i]=v[i];min_count_[hsize_+i]=1;sum_[hsize_+i]=v[i];}for(inti=hsize_;--i>=1;)bottom_up(i);}};}// namespace haar_lib