HDU1754 I Hate It 单点更新+区间求最值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37404150/article/details/78498899
//线段树模版
#include<bits/stdc++.h>
using namespace std;

const int MAXNODE=1<<19;
const int MAXN=2e6+10;

struct NODE{
	int value;  //这里的value表示单点值,取左右儿子的最大值
	int left,right;
}node[MAXNODE];

int father[MAXN];

void BuildTree(int i,int left,int right){
	node[i].left=left;
	node[i].right=right;
	node[i].value=0;
	if(left==right){
		father[left]=i;
		return;
	}
	BuildTree(i<<1,left,(int)(floor(left+right)/2.0));
	BuildTree((i<<1)+1,(int)(floor(left+right)/2.0)+1,right);
}

void UpdateTree(int ri){
	if(ri==1) return ;
	int fi=ri/2;
	int a=node[fi<<1].value;
	int b=node[(fi<<1)+1].value;
	node[fi].value=max(a,b);
	UpdateTree(ri/2);
}

int Max;  //Max可以写到Query函数里面让Query直接返回
void Query(int i,int l,int r){
	if(node[i].left==l&&node[i].right==r){
		Max=max(Max,node[i].value);
		return ;
	}
	i=i<<1;
	if(l<=node[i].right){
		if(r<=node[i].right) Query(i,l,r);
		else Query(i,l,node[i].right);
	}
	i++;
	if(r>=node[i].left){
		if(l>=node[i].left) Query(i,l,r);
		else Query(i,node[i].left,r);
	}
}

int main(){
	int n,m,g;
	ios::sync_with_stdio(false);
	while(cin>>n>>m){
		BuildTree(1,1,n);
		for(int i=1;i<=n;i++){
			cin>>g;
			node[father[i]].value=g;
			UpdateTree(father[i]);
		}
		string op;
		int a,b;
		while(m--){
			cin>>op>>a>>b;
			if(op[0] == 'Q'){
				Max=0;
				Query(1,a,b);
				cout<<Max<<endl;
		}
			else{
				node[father[a]].value=b;
				UpdateTree(father[a]);
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37404150/article/details/78498899