rt
# include <stdio.h>
# include <limits.h>
# include <iostream>
using namespace std;
long long Tree[1000005*4];
long long tag1[1000005*4];
long long tag2[1000005*4];
long long arr[1000005];
int n,m;
void add_tag1(int node,int l,int r,int k)
{
tag1[node] += k;
Tree[node] += k;
return ;
}
void add_tag2(int node,int l,int r,int k)
{
tag1[node] = 0;
tag2[node] = k;
Tree[node] = k;
return ;
}
void push_down(int node,int l,int r)
{
if (tag2[node] != LLONG_MAX)
{
int mid = (l + r) / 2;
add_tag2(node*2,l,mid,tag2[node]);
add_tag2(node*2+1,mid+1,r,tag2[node]);
tag2[node] = LLONG_MAX;
}
if (tag1[node] != 0)
{
int mid = (l + r) / 2;
add_tag1(node*2,l,mid,tag1[node]);
add_tag1(node*2+1,mid+1,r,tag1[node]);
tag1[node] = 0;
}
return ;
}
void Build(int node,int l,int r)
{
tag2[node] = LLONG_MAX;
if (l == r)
{
Tree[node] = arr[l];
return ;
}
int mid = (l+r) /2;
Build(node*2,l,mid);
Build(node*2+1,mid+1,r);
Tree[node] = max(Tree[node*2],Tree[node*2+1]);
return ;
}
void Update1(int node,int l,int r,int tl,int tr,int w)
{
if (tl <= l && tr >= r)
{
add_tag1(node,l,r,w);
return ;
}
push_down(node,l,r);
int mid = (l+r) / 2;
if (mid >= tl)
{
Update1(node*2,l,mid,tl,tr,w);
}
if (mid < tr)
{
Update1(node*2+1,mid+1,r,tl,tr,w);
}
Tree[node] = max(Tree[node*2],Tree[node*2+1]);
return ;
}
void Update2(int node,int l,int r,int tl,int tr,int w)
{
if (tl <= l && tr >= r)
{
add_tag2(node,l,r,w);
return ;
}
push_down(node,l,r);
int mid = (l+r) / 2;
if (mid >= tl)
{
Update2(node*2,l,mid,tl,tr,w);
}
if (mid < tr)
{
Update2(node*2+1,mid+1,r,tl,tr,w);
}
Tree[node] = max(Tree[node*2],Tree[node*2+1]);
return ;
}
long long Query(int node,int l,int r,int tl,int tr)
{
if (tl <= l && tr >= r)
{
return Tree[node];
}
int mid = (l+r)/2;
push_down(node,l,r);
long long res=LLONG_MIN;
if (mid >= tl)
{
res = max(Query(node*2,l,mid,tl,tr),res);
}
if (mid < tr)
{
res = max(Query(node*2+1,mid+1,r,tl,tr),res);
}
return res;
}
int main (void)
{
scanf ("%d %d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf ("%lld",&arr[i]);
}
Build(1,1,n);
for (int i=0;i<m;i++)
{
int opt,x,y;
scanf ("%d %d %d",&opt,&x,&y);
if (opt == 1)
{
int k;
scanf ("%d",&k);
Update2(1,1,n,x,y,k);
}
else if (opt == 2)
{
int k;
scanf ("%d",&k);
Update1(1,1,n,x,y,k);
}
else
{
printf ("%lld\n",Query(1,1,n,x,y));
}
}
return 0;
}
C语言且码风良好(?