P7706求助
  • 板块学术版
  • 楼主zqt16
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/28 21:19
  • 上次更新2024/5/29 09:19:53
查看原帖
P7706求助
1071811
zqt16楼主2024/5/28 21:19
#include<iostream>
#include<string.h>
#include<cstdio> 
#define mid (l+r)>>1
#define lc u<<1
#define rc u<<1|1 
using namespace std;
const long long inf=5e5+16;
int A[inf],B[inf];
struct tree{
	int maxA,minB;
	int maxab,maxbc,ans;
}z[inf<<2];

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)	x=-x,putchar('-');
	if (x>9)	write(x/10);
	putchar(x%10+'0');
}

tree pushup(tree l,tree r){
	tree k;
	k.maxA=max(l.maxA,r.maxA);
	k.minB=min(l.minB,r.minB);
	k.maxab=max(max(l.maxab,r.maxab),l.maxA-r.minB);
	k.maxbc=max(max(l.maxbc,r.maxbc),r.maxA-l.minB);
	k.ans=max(max(l.ans,r.ans),max(l.maxab+r.maxA,r.maxbc+l.maxA));
	return k;
}
void build (int u,int l,int r){
	if (l==r){
		z[u]={A[l],B[l],-inf,-inf,-inf};
		return;
	}
	build(lc,l,mid);
	build(rc,mid+1,r);	
	z[u]=pushup(z[lc],z[rc]);
}
void modify(int u,int x,int l,int r,int x1,int x2){
	if (l==r){
		z[u]={x1,x2,-inf,-inf,-inf};
		return;
	}
	if (x<=mid)	modify(lc,x,l,mid,x1,x2);
	else modify(rc,x,mid+1,r,x1,x2);
	z[u]=pushup(z[lc],z[rc]);
}
tree query(int u,int l,int r,int x,int y){
	if (l>=x&&r<=y)	return z[u];
	if (y<=mid)	return	query(lc,l,mid,x,y);
	else if (x>=mid)	return query(rc,mid+1,r,x,y);
	else	return pushup(query(lc,l,mid,x,y),query(rc,mid+1,r,x,y));
}
int main(){
	int m,n,a,b,c;
	cin>>m>>n;
	for (int i=1;i<=n;i++)	A[i]=read();
	for (int i=1;i<=n;i++)	B[i]=read();
	build(1,1,n);
	for (int i=0;i<m;i++){
		a=read();
		b=read();
		c=read();
		if (a==1)	modify(1,1,n,b,c,B[b]);
		else if (a==2)	modify(1,1,n,b,A[b],c);
		else{
			write(query(1,1,n,b,c).ans);
			puts("");
		}
	}
	return 0;
}
2024/5/28 21:19
加载中...