线段树求调
  • 板块灌水区
  • 楼主Jerry_heng
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/12/22 10:22
  • 上次更新2023/10/24 06:58:33
查看原帖
线段树求调
763878
Jerry_heng楼主2022/12/22 10:22
#include<bits/stdc++.h>
using namespace std;
long long ansx,ansxx,n,T;
long long a[100001],tree[400001],mx[400001],mxx[400001],x,y;
string st;
void build(int o,int l,int r){
	if(l==r){
		tree[o]=a[l];
		mx[o]=a[l];
		mxx[o]=0;
		return;
	}
	int mid=(l+r)>>1;
	build(o*2,l,mid);
	build(o*2+1,mid+1,r);
	if(mx[o*2]>mx[o*2+1]){
		mx[o]=mx[o*2];
		mxx[o]=max(mx[o*2+1],mxx[o*2]);
	}
	else{
		mx[o]=mx[o*2+1];
		mxx[o]=max(mxx[o*2+1],mx[o*2]);
	}
}
void query(int o,int l,int r){
	if(l>=x&&r<=y){
		if(ansx<mx[o]){
			ansx=mx[o];
			ansxx=max(ansxx,mxx[o]);
		}
		else{
			ansxx=max(ansxx,mx[o]);
		}
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)query(o*2,l,mid);
	if(y>mid)query(o*2+1,mid+1,r);
}
void update(int o,int l,int r){
	if(l==r){
		tree[o]=y;
		mx[o]=y;
		mxx[o]=0;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)update(o*2,l,mid);
	else update(o*2+1,mid+1,r);
	if(mx[o*2]>mx[o*2+1]){
		mx[o]=mx[o*2];
		mxx[o]=max(mx[o*2+1],mxx[o*2]);
	}
	else{
		mx[o]=mx[o*2+1];
		mxx[o]=max(mxx[o*2+1],mx[o*2]);
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	cin>>T;
	while(T--){
		cin>>st>>x>>y;
		if(st=="Q"){
			ansx=ansxx=0;
			query(1,1,n);
			cout<<ansx+ansxx<<endl;
		}
		else update(1,1,n);
	}
	return 0;
}
2022/12/22 10:22
加载中...