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);
	}
} 

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