#include using namespace std; typedef pair P; typedef long long ll; typedef vector vi; typedef vector vll; // #define int long long #define pb push_back #define mp make_pair #define eps 1e-9 #define INF 2000000000 //2e9 #define LLINF 1000000000000000000ll // 1e18 #define fi first #define sec second #define all(x) (x).begin(),(x).end() #define sq(x) ((x)*(x)) #define dmp(x) cerr << #x << ": " << x << endl; template void chmin(T& a,const T& b){if(a>b)a=b;} template void chmax(T& a,const T& b){if(a using MaxHeap = priority_queue; template using MinHeap = priority_queue,greater>; template vector vect(int len,T elem){ return vector(len,elem); } template ostream& operator << (ostream& os,const pair& p){ os << p.fi << ',' << p.sec; return os; } template istream& operator >> (istream& is,pair& p){ is >> p.fi >> p.sec; return is; } template ostream& operator << (ostream &os,const vector &vec){ for(int i=0;i istream& operator >> (istream &is,vector& vec){ for(int i=0;i> vec[i]; return is; } void fastio(){ cin.tie(0); ios::sync_with_stdio(0); cout< struct SegmentTreeBeats{ using DMerger = function; vector seg; int length; DMerger dm; D d_unit; SegmentTreeBeats(const vector& vec,DMerger dm,D d_unit = D()):length(1),dm(dm){ while(length=0;i--){ seg[i] = dm(seg[i*2+1],seg[i*2+2]); } } template void update(int a,int b,int k,int l,int r,F break_or_puttag,Args... args){ if(r<=a||b<=l)return; if(a<=l&&r<=b&&(seg[k].*break_or_puttag)(args...))return; seg[k].pushdown(seg[k*2+1],seg[k*2+2]); update(a,b,k*2+1,l,(l+r)/2,break_or_puttag,args...); update(a,b,k*2+2,(l+r)/2,r,break_or_puttag,args...); seg[k] = dm(seg[k*2+1],seg[k*2+2]); } template void update(int a,int b,F break_or_puttag,Args... args){ update(a,b,0,0,length,break_or_puttag,args...); } template Q query(int a,int b,int k,int l,int r,Getter getter,QMerger qm,Q q_unit){ if(r<=a||b<=l)return q_unit; if(a<=l&&r<=b)return (seg[k].*getter)(); seg[k].pushdown(seg[k*2+1],seg[k*2+2]); Q lch = query(a,b,k*2+1,l,(l+r)/2,getter,qm,q_unit); Q rch = query(a,b,k*2+2,(l+r)/2,r,getter,qm,q_unit); return qm(lch,rch); } template Q query(int a,int b,Getter getter,QMerger qm,Q q_unit){ return query(a,b,0,0,length,getter,qm,q_unit); } }; // requirements : // // static Data merge(Data l,Data r) // // void pushdown(Data& l,Data& r) (push down tag) // // for each update query : // bool break_or_puttag_[QUERY] (TAGTYPE tag) // if puttag condition is satisfied, update data and put tag // return : if break condition or puttag condition is satisfied, return true, otherwise return false struct Data{ ll tag,num,sum,mx,mi; Data(ll v = 0ll):tag(0ll),num(1ll),sum(v),mx(v),mi(v){} static Data merge(Data l,Data r){ Data ret; ret.tag = 0ll; ret.num = l.num + r.num; ret.sum = l.sum + r.sum; ret.mx = max(l.mx,r.mx); ret.mi = min(l.mi,r.mi); return ret; } bool add(ll x){ sum += num*x; mx += x; mi += x; tag += x; return true; } bool mod(ll x){ if(mx> N >> Q; vector vec; for(int i=0;i> a; vec.emplace_back(a); } SegmentTreeBeats seg(vec,Data::merge); for(int i=0;i> type; if(type==1){ cin >> l >> r; l--; seg.update(l,r,&Data::mod,2); } if(type==2){ cin >> l >> r >> x; l--; seg.update(l,r,&Data::add,x); } if(type==3){ cin >> l >> r; l--; cout << seg.query(l,r,&Data::get_sum,[](ll x,ll y){return x+y;},0ll) << endl; } } } signed main(){ fastio(); // yosupo_RangeChminChmaxAddRangeSum(); // AOJ_DSL_2_F(); // AOJ_DSL_2_G(); // AOJ_DSL_2_I(); // AOJ_DSL_2_H(); // HDU5306_GorgeousSequnence(); yukicoder879(); return 0; }