rt,我被卡t了
#include<bits/stdc++.h>
using namespace std;
int n,m,ysl[100010];
struct TREE{
long long mx,mn,sm,mxs,bj,ymx,ymn;
}tr[400010];
void hb(TREE x,TREE y,TREE &z){
z.mx=z.ymx=max(x.mx,y.mx);
z.mn=z.ymn=min(x.mn,y.mn);
z.sm=x.sm+y.sm;z.mxs=0;
if(z.mx==x.mx)z.mxs+=x.mxs;
if(z.mx==y.mx)z.mxs+=y.mxs;
z.ymx=z.mx;z.ymn=z.mn;
return;
}
void bjxc(int p,int ls,int rs,int l,int r,int mid){//xian kai gen zai jia
if(tr[p].mx-tr[p].mn<=1){
if(tr[ls].mx==tr[p].ymx){tr[ls].mx=tr[p].mx;}
else{tr[ls].mx=tr[p].mn;}
if(tr[ls].mn==tr[p].ymx){tr[ls].mn=tr[p].mx;}
else{tr[ls].mn=tr[p].mn;}
if(tr[rs].mx==tr[p].ymx){tr[rs].mx=tr[p].mx;}
else{tr[rs].mx=tr[p].mn;}
if(tr[rs].mn==tr[p].ymx){tr[rs].mn=tr[p].mx;}
else{tr[rs].mn=tr[p].mn;}
tr[ls].sm=tr[ls].mx*tr[ls].mxs+tr[ls].mn*(mid-l+1-tr[ls].mxs);
tr[rs].sm=tr[rs].mx*tr[rs].mxs+tr[rs].mn*(r-mid-tr[rs].mxs);
if(tr[ls].mx-tr[ls].mn==0)tr[ls].mxs=mid-l+1;
if(tr[rs].mx-tr[rs].mn==0)tr[rs].mxs=r-mid;
}
else{
tr[ls].mx+=tr[p].bj;tr[ls].mn+=tr[p].bj;
tr[rs].mx+=tr[p].bj;tr[rs].mn+=tr[p].bj;
tr[ls].sm+=tr[p].bj*(mid-l+1);
tr[rs].sm+=tr[p].bj*(r-mid);
}
tr[ls].bj+=tr[p].bj;tr[rs].bj+=tr[p].bj;
tr[p].bj=0;tr[p].ymx=tr[p].mx;tr[p].ymn=tr[p].mn;
return;
}
void js(int l,int r,int p){
if(l==r){
tr[p].mx=tr[p].mn=tr[p].sm=ysl[l];
tr[p].mxs=1;return;
}
int mid=(l+r)>>1,ls=p<<1,rs=(p<<1)+1;
js(l,mid,ls);js(mid+1,r,rs);
hb(tr[ls],tr[rs],tr[p]);
return;
}
void jia(int l,int r,int p,int ll,int rr,long long val){
if(ll<=l&&r<=rr&&tr[p].mx-tr[p].mn<=1){
tr[p].bj+=val;tr[p].mx+=val;tr[p].mn+=val;tr[p].sm+=(r-l+1)*val;
return;
}
int mid=(l+r)>>1,ls=p<<1,rs=(p<<1)+1;
bjxc(p,ls,rs,l,r,mid);
if(ll<=mid)jia(l,mid,ls,ll,rr,val);
if(rr>mid)jia(mid+1,r,rs,ll,rr,val);
hb(tr[ls],tr[rs],tr[p]);
return;
}
void kaig(int l,int r,int p,int ll,int rr){
if(ll<=l&&r<=rr&&tr[p].mx-tr[p].mn<=1){
tr[p].mx=sqrt(tr[p].mx);tr[p].mn=sqrt(tr[p].mn);
if(tr[p].mx-tr[p].mn==0)tr[p].mxs=r-l+1;
tr[p].sm=tr[p].mx*tr[p].mxs+tr[p].mn*(r-l+1-tr[p].mxs);
return;
}
int mid=(l+r)>>1,ls=p<<1,rs=(p<<1)+1;
bjxc(p,ls,rs,l,r,mid);
if(ll<=mid)kaig(l,mid,ls,ll,rr);
if(rr>mid)kaig(mid+1,r,rs,ll,rr);
hb(tr[ls],tr[rs],tr[p]);
return;
}
long long cx(int l,int r,int p,int ll,int rr){
if(ll<=l&&r<=rr){
return tr[p].sm;
}
int mid=(l+r)>>1,ls=p<<1,rs=(p<<1)+1;long long jg=0;
bjxc(p,ls,rs,l,r,mid);
if(ll<=mid)jg+=cx(l,mid,ls,ll,rr);
if(rr>mid)jg+=cx(mid+1,r,rs,ll,rr);
return jg;
}
int main(){
//freopen("qwq.in","r",stdin);
// freopen("qwq.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){scanf("%d",&ysl[i]);}
js(1,n,1);
while(m--){
int t,l,r,v;
scanf("%d%d%d",&t,&l,&r);
if(t==1){
scanf("%d",&v);
jia(1,n,1,l,r,v);
}
else if(t==2){
kaig(1,n,1,l,r);
}
else{
printf("%lld\n",cx(1,n,1,l,r));
}
}
return 0;
}