#include<bits/stdc++.h>
using namespace std;
struct node{
long long l,r,lazy;
long long ans;
};
int n,m;
long long d[100009];
node tree[400009];
void pushdown(long long i){
tree[i*2].lazy =tree[i].lazy;
tree[i*2+1].lazy = tree[i].lazy;
tree[i*2].ans = tree[i].lazy;
tree[i*2+1].ans = tree[i].lazy;
tree[i].lazy = 0;
}
long long ask(long long i,long long l,long long r){
long long t;
if(tree[i].r <= r && tree[i].l >= l) return tree[i].ans;
if(tree[i].lazy != 0) pushdown(i);
t = 0;
if(tree[i*2].r >= l) t=max(ask(i*2,l,r),t);
if(tree[i*2 + 1].l <= r) t=max(ask(i*2+1,l,r),t);
return t;
}
void change(long long i,long long l,long long r,long long k){
if(tree[i].r <= r && tree[i].l >= l){
tree[i].ans=k;
tree[i].lazy=k;
return;
}
if(tree[i].lazy != 0) pushdown(i);
if(tree[i*2].r >= l) change(i*2,l,r,k);
if(tree[i*2+1].l <= r) change(i*2+1,l,r,k);
tree[i].ans = tree[i*2].ans + tree[i*2+1].ans;
}
void build(long long i,long long l,long long r){
long long mid = 0;
tree[i].l = l;
tree[i].r = r;
if(l == r)
{
tree[i].ans =d[r];
return;
}
mid = (l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tree[i].ans = max(tree[i*2].ans,tree[i*2+1].ans);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for(int i = 1;i<=n;i++) cin >> d[i];
build(1,1,n);
for(int i = 1;i<=m;i++)
{
int p;
cin >> p;
if( p == 1)
{
long long x,y,k;
cin >> x >> y >> k;
change(1,x,y,k);
}else
{
long long x,y;
cin >> x >> y;
cout << ask(1,x,y) << "\n";
}
}
}