杭电hdu 1754 i hate it 线段树

http://acm.hdu.edu.cn/showproblem.php?pid=1754

讨论里面的一个数据没有过,结果就wrong了两次,很是悲剧啊,

5 3
1 2 3 4 5
Q 1 5
U 5 0
Q 1 5

就是这组该死的数据,以后还是要多测试两组数据的。

#include <stdio.h>

#define MAX 200010

typedef struct _node
{
	int left;
	int right;
	int high;
}node;

node no[MAX*3];

int n, m;

int t, grade[MAX];

int maxh(int a, int b)
{
	return a > b ? a : b;
}

void initTree(int l, int r, int i)
{
	no[i].left = l;
	no[i].right = r;
	if(l==r){
		no[i].high = grade[t ++];//这里有点儿问题,当为grade[l]时有组测试数据错误
		return ;
	}
	int mid = (l+r)/2;
	initTree(l, mid, i*2);
	initTree(mid+1, r, i*2+1);
	no[i].high = maxh(no[i*2].high, no[i*2+1].high);
}
//修改
void modify(int l, int r, int i, int tmp, int value)
{
	if(no[i].left==no[i].right){
		no[i].high = value;
		return ;
	}
	int mid = (no[i].left+no[i].right)/2;
	if(tmp <= mid){
		modify(l, r, i*2, tmp, value);
	}
	else {
		modify(l, r, i*2+1, tmp, value);
	}
	no[i].high = maxh(no[i*2].high, no[i*2+1].high);
}

int tmpgd;
//查询
void query(int start, int end, int i)
{
	if(no[i].left==start&&no[i].right==end){
		if(tmpgd<no[i].high)tmpgd = no[i].high;
		return ;
	}
	int mid = (no[i].left+no[i].right)/2;
	if(end <= mid){
		query(start, end, i*2);
	}
	else if(start > mid){
		query(start, end, i*2+1);
	}
	else {
		query(start, mid, i*2);
		query(mid+1, end, i*2+1);
	}
}

int main()
{
//	freopen("input.txt","r",stdin);
	int i;
	char c[2];
	int a, b;
	while(scanf("%d%d", &n, &m)!=EOF){
		for(i = 0; i < n; i ++){
			scanf("%d", &grade[i]);
		}
		t = 0;
		initTree(1, n, 1);
		while(m--){
			scanf("%s%d%d", c, &a, &b);
			if(c[0] == 'U')modify(1, n, 1, a, b);
			else {
				tmpgd = 0;
				query(a, b, 1);
				printf("%d\n", tmpgd);
			}
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值