RMQ线段树解析

#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long ll;
const ll Max=9223372036854775807;
const ll Max_N=1000000;
ll d[2*Max-1];
long long n;
void init(ll n_){
	n=1;
	while(n<n_)n*=2;//将n变为2的幂 
	for(ll i=0;i<2*n-1;i++)d[i]=Max;
}
//将第k个(0~indexed)值更新为a 
void update(ll k,ll a){
	k+=n-1;//因为n是2的幂 ,且代表最低层的叶子节点数,所以1~n-1层的节点数之和为叶子数-1
	d[k]=a;
	while(k>0){
		k=(k-1)/2;//(2^(n-1)+k-1-1)/2:从1开始数第k-1个是父节点,而k可能是左孩子也可能是右孩子但是减一取整后 结果一样 
		d[k]=min(d[2*k+1],d[2*k+2]);//因为k是从0开始计数的 
	} 
}
//[l,r]为k节点对应的区间,目标区间不变,通过改变节点区间得到符合条件的区间 
ll query(ll a,ll b,ll k,ll l,ll r){
	if(r<=a||b<=l)return Max;
	if(a<=l&&r<=b)return d[k];
	else {
		ll vl=query(a,b,k*2+1,l,(l+r)/2);
		ll v2=query(a.b.k*2+2,(l+r)/2,r);
		return min(vl,vr);
	}
} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章