本人样例第一个询问会输出一个奇怪的数,应该是初始化的问题,求调
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <random>
#define ls u << 1
#define rs u << 1 | 1
using namespace std;
inline int read()
{
int s=0,w=1;
char c=getchar();
while (!isdigit(c)){if(c=='-')w=-1;c=getchar();}
while(isdigit(c)) s=s*10+(c^48),c=getchar();
return s*w;
}
inline void write(int x)
{
if(x < 0) putchar('-'),x=-x;
if(x > 9) write(x/10);
putchar(x%10+'0');
}
inline int max_of_3 (int x , int y , int z)
{
return max(x , max(y , z));
}
const int N = 500007 , inti = -1e9;
int n , m;
int a[N] , b[N];
struct node
{
int l , r;
int max_sum_ , max__sum , ans;
int maxA , minB;
} tree[N << 2];
void pushup(int u)
{
tree[u].maxA = max(tree[ls].maxA , tree[rs].maxA);
tree[u].minB = min(tree[ls].minB , tree[rs].minB);
tree[u].max_sum_ = max_of_3(tree[ls].max_sum_ , tree[rs].max_sum_ , tree[ls].maxA - tree[rs].minB);
tree[u].max__sum = max_of_3(tree[rs].max__sum , tree[ls].max__sum , tree[rs].maxA - tree[ls].minB);
tree[u].ans = max(max(tree[ls].ans, tree[rs].ans) , max(tree[ls].max_sum_ + tree[rs].maxA , tree[rs].max__sum + tree[ls].maxA));
}
void build(int u , int l , int r)
{
tree[u].l = l, tree[u].r = r;
tree[u].max_sum_ = tree[u].max__sum = tree[u].ans = -1e9;
if(l == r)
{
tree[u].maxA = a[l], tree[u].minB = b[l];
return;
}
int mid = (l + r) >> 1;
build(ls , l , mid);build(rs , mid + 1 , r);
pushup(u);
}
void modify_(int u , int x , int k)
{
if(tree[u].l > x || tree[u].r < x) return;
if(tree[u].l == tree[u].r)
{
tree[u].maxA = k;
return;
}
modify_(ls , x , k);modify_(rs , x , k);
pushup(u);
}
void modify__(int u , int x , int k)
{
if(tree[u].l > x || tree[u].r < x) return;
if(tree[u].l == tree[u].r)
{
tree[u].minB = k;
return;
}
modify__(ls , x , k);modify__(rs , x , k);
pushup(u);
}
int query(int u , int l , int r)
{
if(tree[u].l > r || tree[u].r < l) return tree[0].ans;
if(tree[u].l >= l && tree[u].r <= r) return tree[u].ans;
return query(ls , l , r) + query(rs , l , r);
}
int main(){
n = read();m = read();
for(int i = 1 ; i <= n ; ++ i) a[i] = read();
for(int i = 1 ; i <= n ; ++ i) b[i] = read();
tree[0].max_sum_ = tree[0].max__sum = tree[0].ans = inti;
tree[0].minB = 1e9;
build(1 , 1 , n);
int flag;
int a , b;
for(int i = 0 ; i < m ; ++ i)
{
flag = read();a = read();b = read();
if(flag == 1) modify_(1 , a , b);
else if(flag == 2) modify__(1 , a , b);
else
{
write(query(1 , a , b));
puts("");
}
}
return 0;
}