线段树,求和,最值,数据更新

位运算要比加减预算速度快

#include
#include
using namespace std;

struct Node{
	int l,r,sum,Max,Min;
}Tree[1000<<2];		//开的空间至少要4倍.左移两位就是4倍
void PushUp(int o)	
{
	Tree[o].sum=Tree[o*2].sum+Tree[o*2+1].sum; 
	Tree[o].Max=max(Tree[o*2].Max,Tree[o*2+1].Max);
	Tree[o].Min=min(Tree[o*2].Min,Tree[o*2+1].Min);	
}
void BuidTree(int o,int l,int r)	//建树 
{
	Tree[o].l=l;
	Tree[o].r=r;
	if(l==r)	//搜索到底层,输入数据 
	{
		int t;
		scanf("%d",&t);
		Tree[o].Max=Tree[o].Min=Tree[o].sum=t;
		return;
	}
	int mid=(l+r)>>1;
	BuidTree(o*2,l,mid);	//递归找左子树
	BuidTree(o*2+1,mid+1,r);	//递归找右子树 
	PushUp(o);
}

void UpDate(int o,int l,int r,int x,int y)	//数据更新,将底层x节点值变为y 
{
	if(l==r)
	{
		Tree[o].Max=Tree[o].Min=Tree[o].sum=y;
		return ; 
	}
	int mid=(l+r)>>1;
	if(x<=mid)
		UpDate(o*2,l,mid,x,y);
	else
		UpDate(o*2+1,mid+1,r,x,y);
	PushUp(o);
}
int QuerySum(int o,int l,int r,int x,int y)	//x到y的和 
{
	if(l==x&&y==r)
		return Tree[o].sum;
	int mid=(l+r)>>1;
	if(mid>1;
	if(mid>1;
	if(mid

你可能感兴趣的:(线段树)