HDU -1754线段树

7 篇文章 0 订阅

一道经典线段树入门题:query: 区间最大,Update: 单点更新;

#include<cstdio>
#define M 220000
struct node{
	int l,r;
	int val;
}tree[M*4];

inline int max(int a,int b){       //为了提高运行速度,加内置函数,另外,除法用移位代替。 
	return a>b?a:b;               //乘法用加法代替。 
}          

void build(int l,int r,int d){
	tree[d].l=l;
	tree[d].r=r;
	tree[d].val=0;
	if(l==r){
		scanf("%d",&tree[d].val);
		return;
	}
 	int mid=(r+l)>>1;
	build(l,mid,d<<1);               //移位>加,减法> 乘,除法(运算速度) 
	build(mid+1,r,d+d+1);
	tree[d].val=max(tree[d<<1].val,tree[d+d+1].val);
}

void Update(int p,int date,int d){
	if(tree[d].r==p&&tree[d].l==p){
		tree[d].val=date;
		return ;
	}
	int mid=(tree[d].l+tree[d].r)>>1;
	if(p<=mid) Update(p,date,d<<1);
	if(p>mid)  Update(p,date,d+d+1);
	tree[d].val=max(tree[d<<1].val,tree[d+d+1].val);
}

int search(int l,int r,int d){
	if(tree[d].l==l&&tree[d].r==r){
		return tree[d].val;
	}
	int mid=(tree[d].l+tree[d].r)>>1;
	if(r<=mid) return search(l,r,d<<1);
	if(l>mid)  return search(l,r,d+d+1);  //严重注意d<<1+1是不行的啊,这相当于d*4。 
	if(l<=mid&&r>mid)
	   return max(search(l,mid,d<<1),search(mid+1,r,d+d+1));
}

int main(){
	int i,n,m,l,r;
	char op[2];
	while(~scanf("%d %d",&n,&m)){
		build(1,n,1);
		while(m--){
			scanf("%s %d %d",op,&l,&r);
			if(op[0]=='Q') printf("%d\n",search(l,r,1));
			else Update(l,r,1);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值