#include<bits/stdc++.h> #define FILE "read" #define MAXN 1000010 using namespace std; typedef long long ll; struct node{int ma,se,t,flag;ll num;}tr[MAXN<<3]; int n,m; char buf[1<<15],*fs,*ft; inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;} inline int read(){ int x=0,f=1; char ch=getchar(); while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } void relord(int p){ tr[p].num=tr[p<<1].num+tr[p<<1|1].num; tr[p].ma=max(tr[p<<1].ma,tr[p<<1|1].ma); if(tr[p<<1].ma==tr[p<<1|1].ma){ tr[p].t=tr[p<<1].t+tr[p<<1|1].t; tr[p].se=max(tr[p<<1].se,tr[p<<1|1].se); } else if(tr[p<<1].ma>tr[p<<1|1].ma){ tr[p].t=tr[p<<1].t; tr[p].se=max(tr[p<<1|1].ma,tr[p<<1].se); } else{ tr[p].t=tr[p<<1|1].t; tr[p].se=max(tr[p<<1].ma,tr[p<<1|1].se); } } void cal(int p,int value){ tr[p].num+=(ll)tr[p].t*(value-tr[p].ma); tr[p].ma=tr[p].flag=value; } void pushdown(int p){ int value=tr[p].flag; if(tr[p<<1].ma>value) cal(p<<1,value); if(tr[p<<1|1].ma>value) cal(p<<1|1,value); tr[p].flag=-1; } void build(int p,int l,int r){ tr[p].flag=-1; tr[p].se=0; if(l==r) {tr[p].num=tr[p].ma=read(); tr[p].t=1; return;} int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); relord(p); } void updata(int p,int l,int r,int x,int y,int value){ if(tr[p].flag!=-1) pushdown(p); int mid=(l+r)>>1; if(x>r||y<l) return; if(x<=l&&y>=r){ if(value>=tr[p].ma) return; else if(value>tr[p].se) {cal(p,value);return;} else{ updata(p<<1,l,mid,x,y,value); updata(p<<1|1,mid+1,r,x,y,value); relord(p); return; } } updata(p<<1,l,mid,x,y,value); updata(p<<1|1,mid+1,r,x,y,value); relord(p); } int getmax(int p,int l,int r,int x,int y){ if(tr[p].flag!=-1) pushdown(p); if(x>r||y<l) return 0; if(x<=l&&y>=r) return tr[p].ma; int mid=(l+r)>>1; return max(getmax(p<<1,l,mid,x,y),getmax(p<<1|1,mid+1,r,x,y)); } ll getsum(int p,int l,int r,int x,int y){ if(tr[p].flag!=-1) pushdown(p); if(x>r||y<l) return 0; if(x<=l&&y>=r) return tr[p].num; int mid=(l+r)>>1; return getsum(p<<1,l,mid,x,y)+getsum(p<<1|1,mid+1,r,x,y); } void solve(){ n=read(); m=read(); build(1,1,n); for(int i=1;i<=m;++i){ int opt=read(),l=read(),r=read(); if(opt==0){int x=read();updata(1,1,n,l,r,x);} else if(opt==1)printf("%d\n",getmax(1,1,n,l,r)); else printf("%lld\n",getsum(1,1,n,l,r)); } } int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); for(int T=read();T;--T) solve(); return 0; }
|