#include #define rep(i,n)for(int i=0;i<(n);i++) using namespace std; typedef long long ll; typedef pairP; #define int long long const int MOD=1000000007; const int INF=0x3f3f3f3f; const ll INFL=0x3f3f3f3f3f3f3f3f; struct st{ int s,l,r; }; enum SegtreeType{ CUSTOM, RAQ_RMQ, RAQ_RSQ, RUQ_RMQ, RUQ_RSQ, RMQ_RMQ }; template class LazySegtree{ int n; vectordat; vectorlazy; T INIT; T E0; int E1; functionF0; functionF1; functionF2; public: LazySegtree(int n_,T INIT,T E0,int E1 ,functionF0,functionF1,functionF2): INIT(INIT),E0(E0),E1(E1),F0(F0),F1(F1),F2(F2){ n=1;while(n(2*n); lazy=vector(2*n); for(int i=0;i<2*n-1;i++){ dat[i]=INIT; lazy[i]=E1; } } inline void push(int k,int s){ if(lazy[k]==E1)return; dat[k]=F0(dat[k],lazy[k],s); if(k>n>>q; LazySegtreeseg(n,{1,0,0},{0,-1,-1},0, [](st a,int b,int s){ return (st){a.s,a.l+b,a.r+b}; }, [](int a,int b){ return a+b; }, [](st a,st b){ return (st){a.s+b.s-(a.r==b.l),a.l,b.r}; } ); rep(i,n){ int a;scanf("%lld",&a); seg.update(i,a); } rep(i,q){ int t;scanf("%lld",&t); if(t==1){ int l,r,x;scanf("%lld%lld%lld",&l,&r,&x);l--; seg.update(l,r,x); } else{ int l,r;scanf("%lld%lld",&l,&r);l--; printf("%lld\n",seg.query(l,r).s); } } }