求助(玄关)
查看原帖
求助(玄关)
1287433
__ycy1124__楼主2024/7/17 10:23

求调find函数

#include<bits/stdc++.h>
using namespace std;
struct Node{
	long long lma,rma;
	long long int w,ma;
	int l,r;
}nod[8000001];
void read(long long int &x){
	x=0;
	int f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-f;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x*=10;
		x+=ch-'0';
		ch=getchar();
	}
	x*=f;
}
long long int w[1000001];
void push_up(int p){
	nod[p].w=nod[p*2].w+nod[p*2+1].w;
	nod[p].lma=max(nod[p*2].lma,nod[p*2].w+nod[p*2+1].lma);
	nod[p].rma=max(nod[p*2+1].rma,nod[p*2+1].w+nod[p*2].rma);
	nod[p].ma=max(nod[p*2].rma+nod[p*2+1].lma,max(nod[p*2].ma,nod[p*2+1].ma));
}
void New_Tree(int l,int r,int p){
	int mid=l+r>>1;
	nod[p].l=l;
	nod[p].r=r;
	if(l==r){
		nod[p].w=w[l];
		nod[p].ma=w[l];
		nod[p].lma=w[l];
		nod[p].rma=w[l];
		return;
	}
	New_Tree(l,mid,p*2);
	New_Tree(mid+1,r,p*2+1);
	push_up(p);
}
void abb(int l,int r,int p,int cnt,int val){
	int mid=l+r>>1;
	if(l==r){
		nod[p].w=val;
		nod[p].ma=val;
		nod[p].lma=val;
		nod[p].rma=val;
		return;
	}
	if(cnt>mid){
		abb(mid+1,r,p*2+1,cnt,val);
		push_up(p);
	}
	else{
		abb(l,mid,p*2,cnt,val);
		push_up(p);
	}
}
long long int find(int l,int r,int p){
	int mid=nod[p].l+nod[p].r>>1;
	if(l==nod[p].l&&r==nod[p].r){
		return nod[p].w; 
	}
	if(l<=mid&&r>mid){
		return max(nod[p*2].rma+nod[p*2+1].lma,max(nod[p*2].lma,nod[p*2+1].rma));
	}
	else if(r<=mid){
		return find(l,mid,p*2);
	}
	else{
		return find(mid+1,r,p*2+1);
	}
}
int main(){
	long long int n,m;
	read(n);
	read(m);
	for(int i=1;i<=n;i++){
		read(w[i]);
	}
	New_Tree(1,n,1);
	long long int ma=0;
	for(int i=1;i<=m;i++){
		long long int op,x,y;
		read(op);
		read(x);
		read(y);
		if(op==0){
			abb(1,n,1,x,y);
			continue;
		}
		else{
			cout<<find(x,y,1)<<'\n';
		}
	}
	printf("%lld",ma);
	return 0;
}
2024/7/17 10:23
加载中...