玄关求条
查看原帖
玄关求条
683212
Henly_Z楼主2025/7/25 21:59
#include<bits/stdc++.h>
#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid ((l+r)>>1)
#define int long long
#define INF -1e8-10
using namespace std;
constexpr int N = 1000005;
int n , m;
struct S{
	int am , bm , lx , rx , mx;
}segt[N << 3];
struct Node{
	int a , b;
}a[N];
S pushup(S s1 ,  S s2){
	S tag;
	tag.am = max(s1.am , s2.am);
	tag.bm = min(s1.bm , s2.bm);
	tag.lx = s1.am - s2.bm;
	tag.rx = s2.am - s1.bm;
	tag.lx = max(tag.lx , max(s1.lx , s2.lx));
	tag.rx = max(tag.rx , min(s1.rx , s2.rx));
	tag.mx = max(s1.lx + s2.am , s2.rx + s1.bm);
	tag.mx = max(tag.mx , max(s1.mx , s2.mx));
	return tag;
}

void build(int u , int  l , int r){
	if(l == r){
		segt[u].am = a[1].a;
		segt[u].bm = a[1].b;
		segt[u].lx = segt[u].rx = segt[u].mx = INF;
		return ;
	}
	build(ls , l , mid);
	build(rs , mid + 1 , r);
	segt[u] = pushup(segt[ls] , segt[rs]);
}

void update(int u , int l , int r , int pos , int k , int op){
	if(l == r){
		if(op == 1){
			segt[u].lx = k;
		}
		else{
			segt[u].rx = k;
		}
		return ;
	}
	if(pos <= mid){
		update(ls , l , mid , pos , k , op);
	}
	if(pos > mid){
		update(rs , mid + 1 , r , pos , k , op);
	}
	segt[u] = pushup(segt[ls] , segt[rs]);
}

S query(int u , int l , int r , int L , int R){
	if(L <= l && r <= R){
		return segt[u];
	}
	if(L > mid){
		return query(ls , l , mid , L, R);
	}
	if(R <= mid){
		return query(rs , mid + 1 , r , L , R);
	}
	return pushup(segt[ls] , segt[rs]);
}
signed main(){
	scanf("%lld%lld", &n , &m);
	for(int i = 1 ; i <= n ; i++){
		scanf("%lld" , &a[i].a);
	} 
	for(int i = 1 ; i <= n ; i++){
		scanf("%lld" , &a[i].b);
	}
	build(1,1,n);
	while(m--){
		int op , x , y;
		scanf("%lld%lld%lld" , &op , &x , &y);
		if(op == 3){
			cout << query(1,1,n,x,y).mx << endl; 
		} 
		else{
			update(1,1,n,x,y,op);
		}
	}
}
2025/7/25 21:59
加载中...