只有1,3数据点过了
#include<iostream>
using namespace std;
#define int long long
const int N = 1e6 + 7;
const long long INF = -1e18 ;
const int UN = 2e9 ;
int n,m;
int a[N];
struct SegmentTree{
int l,r;
long long data;
long long add;
long long to;
}t[4 * N];
void build(int p,int l,int r){
t[p].to = UN;
t[p].l = l;
t[p].r = r;
if(l == r){
t[p].data = a[l];
return ;
}
int mid = (l + r) / 2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].data = max(t[p*2].data,t[p*2+1].data);
return ;
}
void spread(int p){
if(t[p].to != UN){
t[p*2].data = t[p].to;
t[p*2+1].data = t[p].to;
t[p*2].to = t[p].to;
t[p*2+1].to = t[p].to;
t[p*2].add = 0;
t[p*2+1].add = 0;
t[p].to = UN;
}
if(t[p].add){
t[p*2].data += t[p].add;
t[p*2+1].data += t[p].add;
t[p*2].add += t[p].add;
t[p*2+1].add += t[p].add;
t[p].add = 0;
}
return ;
}
void change1(int p,int l,int r,int v){
if(l <= t[p].l && r >= t[p].r){
t[p].data = v;
t[p].to = v;
t[p].add = 0;
return ;
}
spread(p);
int mid = (t[p].l + t[p].r) / 2;
if(l <= mid) change1(p*2,l,r,v);
if(r > mid) change1(p*2+1,l,r,v);
t[p].data = max(t[p*2].data,t[p*2+1].data);
return ;
}
void change2(int p,int l,int r,int v){
if(l <= t[p].l && r >= t[p].r){
t[p].data += v;
t[p].add += v;
return ;
}
spread(p);
int mid = (t[p].l + t[p].r) / 2;
if(l <= mid) change2(p*2,l,r,v);
if(r > mid) change2(p*2+1,l,r,v);
t[p].data = max(t[p*2].data,t[p*2+1].data);
return ;
}
long long ask(int p,int l,int r){
if(l <= t[p].l && r >= t[p].r){
return t[p].data;
}
spread(p);
int mid = (t[p].l + t[p].r) / 2;
long long val = INF;
if(l <= mid) val = max(val,ask(p*2,l,mid));
if(r > mid) val = max(val,ask(p*2+1,mid+1,r));
return val;
}
signed main(){
cin>>n>>m;
for(int i = 1;i <= n;i++)scanf("%lld",&a[i]);
build(1,1,n);
while(m--){
int type,l,r;
scanf("%lld%lld%lld",&type,&l,&r);
if(type == 1){
int k;
scanf("%lld",&k);
change1(1,l,r,k);
}
else if(type == 2){
int k;
scanf("%lld",&k);
change2(1,l,r,k);
}
else{
printf("%lld\n",ask(1,l,r));
}
}
return 0;
}