#include<iostream>#include<vector>usingnamespace std;conststaticint MAX_N =1<<17;int n, dat[MAX_N -1];/*
* 将 n变成 2的幂次 的好处是这样, 最终所有的单区间值都在最下层, 方便修改值
*
* */voidinit(int _n){
n =1;while(n < _n){
n <<=1;}for(int i =0; i <2* n -1;++i){
dat[i]= INT_MAX;}}voidupdate(int index,int v){
index += n -1;
dat[index]= v;while(index >0){
index =(index -1)/2;
dat[index]=min(dat[2* index +1], dat[2* index +2]);}}intquery(int ql,int qr,int node =0,int left =0,int right = n -1){if(ql > right || qr < left){return INT_MAX;}if(ql <= left && qr >= right){return dat[node];}else{int lv =query(ql, qr,2* node +1, left,(left + right)/2);int rv =query(ql, qr,2* node +2,(left + right)/2+1, right);returnmin(lv, rv);}}intmain(){
vector<int> nums{3,2,4,7};init(nums.size());for(int i =0; i < nums.size();++i){update(i, nums[i]);}update(3,3);for(int i =0; i <2* n -1;++i){
cout << dat[i]<<" ";}
cout << endl;return0;}
classSegmentTree{public:int n;
vector<int> tree;SegmentTree(int sz){
n =1;while(n < sz) n <<=1;
tree.resize(n *2, INT_MAX);}voidupdate(int i,int val){
i +=(n -1);
tree[i]= val;while(i >0){int p =(i -1)/2;
tree[p]=min(tree[(p <<1)+1], tree[(p <<1)+2]);
i = p;}}intquery(int L,int R){int left = n -1, right =2*(n -1);
L += n -1;
R += n -1;return_query(left, right,0, L, R);}int_query(int left,int right,int nodeId,int L,int R){if(L <= left && right <= R){return tree[nodeId];}int mid =(left + right)/2;if(mid >= R){return_query(left, mid,(nodeId <<1)+1, L, R);}elseif(mid < L){return_query(mid +1, right,(nodeId <<1)+2, L, R);}returnmin(_query(left, mid,(nodeId <<1)+1, L, R),_query(mid +1, right,(nodeId <<1)+2, L, R));}};intmain(){
vector<int> data ={0,1,-1,-3,-5,-7,-8};int n = data.size();
SegmentTree tree(n);for(int i =0; i < n; i++){
tree.update(i, data[i]);}for(int i =0; i < n; i++){for(int j = i; j < n; j++){
cout << tree.query(i, j)<<" ";}
cout << endl;}}