线段树RMQ(MAX)模板
const int MAX_N=300010;
int dat[2*MAX_N-1];
int n;
#define maxn 0x3f3f3f3f
void init(int _n){
n=1;
while(n<_n)
n<<=1;
for(int i=0;i<2*n-1;i++)
dat[i]=maxn;
}
void update(int k, int a){ //将位置k的值改为a
k+=n-1; //从n-1处开始存放单个元素的值
dat[k]=a;
while(k>0){
k=(k-1)/2;
dat[k]=max(dat[k*2+1],dat[k*2+2]);
}
}
int query(int l,int r,int k,int a,int b){ //在[l,r)范围内查询RMQ[a,b)
if(a>=r||b<=l)
return maxn;
if(a>=l&&b<=r)
return dat[k];
else{
int datl=query(l,(l+r)/2,k*2+1,a,b);
int datr=query((l+r)/2,r,k*2+2,a,b);
return max(datl,datr);
}
}
//调用时query(0,n,0,a,b)
dat数组从0开始使用,dat[0]表示整个区间最大值,dat[1]和dat[2]分别表示前一半区间和后一半区间的最大值,用公式可表示为2*n+1和2*n+2。query函数参数中的l,r,k表示区间[l,r)的最大值为dat[k]。