templete_线段树

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>

using namespace std;

const int MAXNODE = 1000 * 4;//½áµãµÄÊýÄ¿Ò»°ãÊÇ×î´ó·¶Î§µÄËı¶¡£ 

struct Tree
{
	int val; //ÕâÊÇÕâ¸ö½áµãËù´ú±íµÄÆäËûµÄÒâÒ壬Õâ¸öÄã¿ÉÒÔ¸ù¾ÝÌâÒâ×Ô¼º¸Ä±ä 
	int L, R;//ÕâÊǽáµãËù´ú±íµÄ·¶Î§£» 
}tree[MAXNODE];

void pushUp(int i)//ÕâÊǸù¾ÝÌâÄ¿µÄÒâÒå×ö³öÉÏÍƵĶ¯×÷£¬Õâ¸ö¸ù¾ÝÌâÄ¿Òâ˼£¬¿´Ó¦¸ÃÔõÑùµÄÉÏÍÆ 
{
	//ÕâÀï¼Ù¶¨ÊÇÇó´óÖµ£»
	tree[i].val = max(tree[i << 1].val, tree[i << 1 | 1].val); 
}

void buildTree(int i, int L, int R)
{
	tree[i].L = L;
	tree[i].R = R;
	tree[i].val = 0;
	if (L == R)
	{
		int val;
		scanf("%d", &val); 
		tree[i].val = val;//ÕâÀïÊÇÓÃÀ´È¡Êý¾ÝµÄ¡£ 
		return ;//Ò»¶¨Òª×¢Òâreturn; 
	}
	int mid = L + (R - L) / 2;
	buildTree(i << 1, L, mid);
	buildTree(i << 1 | 1, mid + 1, R);
	pushUp(i); 
}

void update(int i, int key, int val) //µ¥µã¸üС£ 
{
	if (tree[i].L == key && tree[i].R == key)
	{
		tree[i].val = val;
		return ; //ÕâÀïÒ²ÊÇҪעÒâµÄ£¬¸üÐÂÍêÁËÖ®ºóÒ»¶¨Òª¼ÇµÃ·µ»Ø 
	}
	int mid = tree[i].L + (tree[i].R - tree[i].L) / 2;
	if (key <= mid)
	{
		update(i << 1, key, val);
	}
	else
	{
		update(i << 1 | 1, key, val);
	}
	pushUp(i);
}

int query(int i, int L, int R)
{
	if (L <= tree[i].L && R >= tree[i].R) //ÕâÀïÊÇÈ¥³ýÌØÊâÊý¾ÝµÄ²»´íÑ¡Ôñ 
	{
		return tree[i].val;
	}
	int mid = tree[i].L + (tree[i].R - tree[i].L) / 2;
	if (R <= mid)
	{
		return query(i << 1, L, R);
	}
	else if (L > mid)
	{
		return query(i << 1 | 1, L, R);
	}
	else
	{
		return max(query(1 << 1, L, mid), query(i << 1 | 1, mid + 1, R));
	}
}


int main()
{
	int N, M;
	while (scanf("%d%d", &N, &M) != EOF)
	{
		buildTree(1, 1, N);
		int temp;
		int a, b;
		for (int i = 0; i < M; i++)
		{
			scanf("%d", &temp);
			if (temp == 0)
			{
				scanf("%d%d", &a, &b);
				update(1, a, b);
			}
			else
			{
				scanf("%d%d", &a, &b);
				int ans = query(1, a, b);
				printf("The ans is : %d\n", ans);
			}
		}
		
	}
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值