#include<bits/stdc++.h>
#define int long long
#define inf LLONG_MAX
using namespace std;
int n = 0 , m = 0;
array<int , 300100> a , b;
struct Tree{
int l;
int r;
int tag_val[2];
int tag_min[2];
int the_max[2];
int sec_max[2];
int max_val[2][2];
};
array<Tree , 8000100> tree;
void pushup(int k)
{
for(auto x : {0 , 1})
{
if(tree[k << 1].the_max[x] == tree[k << 1 | 1].the_max[x])
{
tree[k].the_max[x] = tree[k << 1].the_max[x];
tree[k].sec_max[x] = max(tree[k << 1].sec_max[x] , tree[k << 1 | 1].sec_max[x]);
}
else if(tree[k << 1].the_max[x] > tree[k << 1 | 1].the_max[x])
{
tree[k].the_max[x] = tree[k << 1].the_max[x];
tree[k].sec_max[x] = max(tree[k << 1].sec_max[x] , tree[k << 1 | 1].the_max[x]);
}
else
{
tree[k].the_max[x] = tree[k << 1 | 1].the_max[x];
tree[k].sec_max[x] = max(tree[k << 1].the_max[x] , tree[k << 1 | 1].sec_max[x]);
}
}
if(tree[k].the_max[0] == tree[k << 1].the_max[0] && tree[k].the_max[1] == tree[k << 1].the_max[1])
{
tree[k].max_val[1][1] = tree[k << 1].max_val[1][1];
tree[k].max_val[0][1] = tree[k << 1].max_val[0][1];
tree[k].max_val[1][0] = tree[k << 1].max_val[1][0];
tree[k].max_val[0][0] = tree[k << 1].max_val[0][0];
}
else if(tree[k].the_max[0] == tree[k << 1].the_max[0] && tree[k].the_max[1] != tree[k << 1].the_max[1])
{
tree[k].max_val[1][1] = tree[k].max_val[0][1] = -inf;
tree[k].max_val[1][0] = max(tree[k << 1].max_val[1][1] , tree[k << 1].max_val[1][0]);
tree[k].max_val[0][0] = max(tree[k << 1].max_val[0][1] , tree[k << 1].max_val[0][0]);
}
else if(tree[k].the_max[0] != tree[k << 1].the_max[0] && tree[k].the_max[1] == tree[k << 1].the_max[1])
{
tree[k].max_val[1][1] = tree[k].max_val[1][0] = -inf;
tree[k].max_val[0][1] = max(tree[k << 1].max_val[1][1] , tree[k << 1].max_val[0][1]);
tree[k].max_val[0][0] = max(tree[k << 1].max_val[1][0] , tree[k << 1].max_val[0][0]);
}
else
{
tree[k].max_val[1][1] = tree[k].max_val[1][0] = tree[k].max_val[0][1] = -inf;
tree[k].max_val[0][0] = max({tree[k << 1].max_val[0][0] , tree[k << 1].max_val[0][1] , tree[k << 1].max_val[1][0] , tree[k << 1].max_val[1][1]});
}
if(tree[k].the_max[0] == tree[k << 1 | 1].the_max[0] && tree[k].the_max[1] == tree[k << 1 | 1].the_max[1])
{
tree[k].max_val[1][1] = max(tree[k].max_val[1][1] , tree[k << 1 | 1].max_val[1][1]);
tree[k].max_val[1][0] = max(tree[k].max_val[1][0] , tree[k << 1 | 1].max_val[1][0]);
tree[k].max_val[0][1] = max(tree[k].max_val[0][1] , tree[k << 1 | 1].max_val[0][1]);
tree[k].max_val[0][0] = max(tree[k].max_val[0][0] , tree[k << 1 | 1].max_val[0][0]);
}
else if(tree[k].the_max[0] == tree[k << 1 | 1].the_max[0] && tree[k].the_max[1] != tree[k << 1 | 1].the_max[1])
{
tree[k].max_val[1][0] = max({tree[k].max_val[1][0] , tree[k << 1 | 1].max_val[1][1] , tree[k << 1 | 1].max_val[1][0]});
tree[k].max_val[0][0] = max({tree[k].max_val[0][0] , tree[k << 1 | 1].max_val[0][1] , tree[k << 1 | 1].max_val[0][0]});
}
else if(tree[k].the_max[0] != tree[k << 1 | 1].the_max[0] && tree[k].the_max[1] == tree[k << 1 | 1].the_max[1])
{
tree[k].max_val[0][1] = max({tree[k].max_val[0][1] , tree[k << 1 | 1].max_val[1][1] , tree[k << 1 | 1].max_val[0][1]});
tree[k].max_val[0][0] = max({tree[k].max_val[0][0] , tree[k << 1 | 1].max_val[1][0] , tree[k << 1 | 1].max_val[0][0]});
}
else
{
tree[k].max_val[0][0] = max({tree[k].max_val[0][0] , tree[k << 1 | 1].max_val[0][0] , tree[k << 1 | 1].max_val[0][1] , tree[k << 1 | 1].max_val[1][0] , tree[k << 1 | 1].max_val[1][1]});
}
return;
}
void pushmin(int k , int pos , int val)
{
if(tree[k].the_max[pos] <= val) return;
if(tree[k].max_val[1][1] != -inf) tree[k].max_val[1][1] += (val - tree[k].the_max[pos]);
if(tree[k].max_val[!pos][pos] != -inf) tree[k].max_val[!pos][pos] += (val - tree[k].the_max[pos]);
tree[k].the_max[pos] = tree[k].tag_min[pos] = val;
return;
}
void pushsum(int k , int pos , int val)
{
for(auto x : {0 , 1})
{
for(auto y : {0 , 1})
{
if(tree[k].max_val[x][y] != -inf) tree[k].max_val[x][y] += val;
}
}
tree[k].the_max[pos] += val;
if(tree[k].sec_max[pos] != -inf) tree[k].sec_max[pos] += val;
if(tree[k].tag_min[pos] != inf) tree[k].tag_min[pos] += val;
tree[k].tag_val[pos] += val;
return;
}
void pushdown(int k)
{
for(auto x : {0 , 1})
{
if(tree[k].tag_val[x])
{
pushsum(k << 1 , x , tree[k].tag_val[x]);
pushsum(k << 1 | 1 , x , tree[k].tag_val[x]);
}
}
for(auto x : {0 , 1})
{
if(tree[k].tag_min[x] != inf)
{
pushmin(k << 1 , x , tree[k].tag_min[x]);
pushmin(k << 1 | 1 , x , tree[k].tag_min[x]);
}
}
tree[k].tag_val[0] = tree[k].tag_val[1] = 0;
tree[k].tag_min[0] = tree[k].tag_min[1] = inf;
return;
}
void build(int k , int l , int r)
{
tree[k].l = l;
tree[k].r = r;
tree[k].tag_val[0] = tree[k].tag_val[1] = 0;
tree[k].tag_min[0] = tree[k].tag_min[1] = inf;
if(l == r)
{
tree[k].the_max[0] = a[l] , tree[k].the_max[1] = b[l];
tree[k].sec_max[0] = -inf , tree[k].sec_max[1] = -inf;
tree[k].max_val[1][1] = a[l] + b[l];
tree[k].max_val[0][1] = tree[k].max_val[1][0] = tree[k].max_val[0][0] = -inf;
return;
}
int mid = l + (r - l) / 2;
build(k << 1 , l , mid);
build(k << 1 | 1 , mid + 1 , r);
pushup(k);
return;
}
int query_max(int k , int l , int r)
{
if(l <= tree[k].l && tree[k].r <= r)
{
return max({tree[k].max_val[0][0] , tree[k].max_val[0][1] , tree[k].max_val[1][0] , tree[k].max_val[1][1]});
}
pushdown(k);
int mid = tree[k].l + (tree[k].r - tree[k].l) / 2 , res = INT_MIN;
if(l <= mid) res = max(res , query_max(k << 1 , l , r));
if(r > mid) res = max(res , query_max(k << 1 | 1 , l , r));
return res;
}
void update_min(int pos , int k , int l , int r , int c)
{
if(c >= tree[k].the_max[pos]) return;
if(l <= tree[k].l && tree[k].r <= r && c > tree[k].sec_max[pos])
{
pushmin(k , pos , c);
return;
}
pushdown(k);
int mid = tree[k].l + (tree[k].r - tree[k].l) / 2;
if(l <= mid) update_min(pos , k << 1 , l , r , c);
if(r > mid) update_min(pos , k << 1 | 1 , l , r , c);
pushup(k);
return;
}
void add(int pos , int k , int l , int r , int c)
{
if(l <= tree[k].l && tree[k].r <= r)
{
pushsum(k , pos , c);
return;
}
pushdown(k);
int mid = tree[k].l + (tree[k].r - tree[k].l) / 2;
if(l <= mid) add(pos , k << 1 , l , r , c);
if(r > mid) add(pos , k << 1 | 1 , l , r , c);
pushup(k);
return;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m;
for(int i = 1;i <= n;++ i)
{
cin >> a[i];
}
for(int i = 1;i <= n;++ i)
{
cin >> b[i];
}
build(1 , 1 , n);
for(int i = 1;i <= m;++ i)
{
int opt = 0 , l = 0 , r = 0 , c = 0;
cin >> opt;
switch(opt)
{
case 1:{
cin >> l >> r >> c;
update_min(0 , 1 , l , r , c);
break;
}
case 2:{
cin >> l >> r >> c;
update_min(1 , 1 , l , r , c);
break;
}
case 3:{
cin >> l >> r >> c;
add(0 , 1 , l , r , c);
break;
}
case 4:{
cin >> l >> r >> c;
add(1 , 1 , l , r , c);
break;
}
case 5:{
cin >> l >> r;
cout << query_max(1 , l , r) << '\n';
break;
}
}
}
cout << endl;
return 0;
}
/*
40 7
207034354 -246882716 418104869 16573831 4288587 -305140969 -448782876 -481742539 88128885 215113493 212491579 128282599 411892546 -332420438 231623436 -38249183 466152387 -269662562 -272492300 -183153310 195282267 329510247 -414629746 448170091 -206454920 53524444 -482959455 177919156 -436453310 207475873 -77247256 134493016 -314559848 175985713 -165087103 -79504499 198072451 453652620 212683079 -459590992
-256820940 -113435747 -272254112 -49589201 -254487331 -136552134 136280867 -181854208 264961967 232722749 -193031034 302540000 365606572 -408348851 -387922201 -240668587 76886686 456514058 -205479941 -407122932 168767473 -486123015 120585240 236426037 -353951717 -455400474 -88500160 -21195848 -335876138 -389902909 32294556 -415007266 -388194896 294492344 18710218 132349706 -42967371 -267816193 381407299 -314765183
2 30 39 441717701
4 9 33 251153782
2 4 38 -390379152
3 3 28 -396007217
3 22 26 429478609
4 5 29 95002138
5 15 30
*/
U180387